STM32使用按键控制串口发送和停止

主要用到三部分的内容,

  1. GPIO控制LED灯的亮灭
  2. EXTI外部按键触发中断,在中断中控制串口的使能
  3. USART串口发送数据

一、GPIO控制LED

首先开启对应的时钟,配置GPIO为推挽输出:

 GPIO_InitTypeDef gpio_s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);gpio_s.GPIO_Pin = GPIO_Pin_8;gpio_s.GPIO_Mode = GPIO_Mode_Out_PP;gpio_s.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio_s);

对于LED的控制放置在EXTI的中断函数中,实现发送时led灯亮,停止时LED灯灭的效果。

二、EXTI按键外部中断(要开启AFIO时钟)

在外部中断中需要做四方面的工作

  1. 配置外部中断的GPIO
  2. 配置NVIC
  3. 配置EXTI
  4. 书写中断服务函数

1、配置外部中断的GPIO

配置外部中断的GPIO需要知道我们想要以什么样的方式触发中断,使用下降沿还是上升沿或者是边沿触发。在我的实验中根据电路原理图来选择的。

原理图可以看出当按键被按下是GPIO口被拉低,所以当按键没有按下时需要让端口保持高电平,因此这里选用上拉输入。

 GPIO_InitTypeDef gpio_s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC,ENABLE);gpio_s.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_13;gpio_s.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC,&gpio_s);

2、配置NVIC

说句实话每次搞中断总是忘记配置这个,所以多搞几次就记住了。
配置NVIC的作用就是打开某个中断并配置中断的优先级。所以配置的过程需要知道总共有多少个优先级可以配置。这就是下面这行代码:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

具体这个看下面这个:

关于抢占优先级和响应优先级,举个例子:
有三个分别是A、B、C
A抢占优先级为0,响应优先级为0
B抢占优先级为0,响应优先级为1
C抢占优先级为1,响应优先级为0
当A\B\C三个中断同时发生时A最先执行,B次之,C最后。
在NVIC配置中主要就是配置某个中断的这两个优先级,同时开启某个中断向量的中断响应。

 NVIC_InitTypeDef nvic_s;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);nvic_s.NVIC_IRQChannel = EXTI1_IRQn;nvic_s.NVIC_IRQChannelPreemptionPriority = 0;nvic_s.NVIC_IRQChannelSubPriority = 0;nvic_s.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_s);

3、配置EXTI

配置EXTI就是配置具体某个外部中断以及其的触发方式。
我们知道GPIOA、GPIOB、GPIOC、GPIOD、GPIOE这几组GPIO中如PA1,、PB1、PC1、PD1、PE1这几的中断是同一个,中断函数也是同一个,因此在具体配置EXTI之前需要设置哪端口,那个引脚就是下面这句代码:

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);

上述的大概就是下面这图:

接下来就是配置相应的EXTI:

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);exti_s.EXTI_Line = EXTI_Line13;exti_s.EXTI_Mode = EXTI_Mode_Interrupt;exti_s.EXTI_Trigger = EXTI_Trigger_Falling;exti_s.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_s);

4、书写中断服务函数

以上配置好以后,需要书写当中断发生时做什么。当中断响应以后会进入到相应的中断服务函数中,对于中断服务函数而言每一个中断都有固定的函数名参数和返回类型,不可更改。
具体的如下代码:

void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) != RESET){GPIO_ResetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOD,GPIO_Pin_2);USART_Cmd(USART1,ENABLE);EXTI_ClearITPendingBit(EXTI_Line1);}
}

在这个中断函数使用EXTI_GetITStatus(EXTI_Line1) != RESET来确定发生中断,执行的程序放在该条件代码块内。
在这个中断函数中首先将两个LED点亮,然后使能USART串口,最后清除中断标志位,等待下次中断。

三、USART串口配置

对于USART配置来说相对比较好记忆:

  1. USART中GPIO的配置
  2. USART的配置
  3. 编写发送的函数

1、USART中GPIO的配置

对于USART来说需要使用两个GPIO,一个用作Tx一个用作Rx。
对于这两个的配置是不同的,对于Tx而言是发送口,需要将GPIO配置为复用推挽输出,对于Rx而言是接收口,需要将GPIO配置为浮空输入。
同时USART的两个口是固定的并且USART1和其他的挂载总线不一样,就开启的时钟不一样,用的时候现查吧!
具体的配置代码:

 GPIO_InitTypeDef gpio_s;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ENABLE);gpio_s.GPIO_Pin = GPIO_Pin_9;gpio_s.GPIO_Mode = GPIO_Mode_AF_PP;gpio_s.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio_s);gpio_s.GPIO_Pin = GPIO_Pin_10;gpio_s.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&gpio_s);

2、usart配置

在USART配置中主要是配置相关的串口的一些参数,波特率、停止位等同时设定串口的接发模式。

 USART_InitTypeDef usart_s;usart_s.USART_BaudRate = 115200;usart_s.USART_WordLength = USART_WordLength_8b;usart_s.USART_StopBits = USART_StopBits_1;usart_s.USART_Parity = USART_Parity_No;usart_s.USART_HardwareFlowControl = USART_HardwareFlowControl_None;usart_s.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//USART_ITConfig(USART1,USART_IT_RXNE|USART_IT_TC,ENABLE);USART_Init(USART1,&usart_s);

其中注释的一行为串口中断的开启,在这里没有使用所以就没有开启。

3、编写串口发送函数

首先发送一个字符,然后将字符串一个一个字符的发送就可以了,库函数提供了一个发送字节的函数,利用它发送然后得到发送完成标志位就可以了。具体实现代码:

void usart_SendByte(u8 b)
{USART_SendData(USART1,b);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}

该函数实现了对单个字符的发送,接下来就是循环发送每个字符直到字符串的最后一个字符:
具体实现代码:

void usart_SendString(u8* data)
{while(*data){usart_SendByte(*data++);}
}

至此,所有的功能已经配置完毕,就等主函数来调兵谴将。
在主函数调用函数,完成以上的配置,然后在死循环中一直发送某个数据,当按键一按下时开始发送,当按键而按下时停止发送==写到这里才发现不是发报机,发报机是按下发送,弹起停止发送。尴尬了。。。==到底是个什么鬼,还是看看主函数吧:

int main(void){GPIO_Config();EXTI_Config();USART_Config();usart_SendString("start");while(1){usart_SendString("hello\r\n");}
}

STM32嘀!嘀!嘀!点触式发报机相关推荐

  1. c语言实现1khz的方波,“嘀、嘀、……”报警声电路设计(产生频率为1KHz)

    "嘀.嘀.--"报警声 1. 实验任务 用AT89S51单片机产生"嘀.嘀.-"报警声从P1.0端口输出,产生频率为1KHz,根据上面图可知:1KHZ方波从P1 ...

  2. 单片机c语言警报程序,51单片机产生“嘀、嘀、……”报警声

    生活中我们常常到各种各样的报警声,例如"嘀.嘀.-"就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为1KHz,则报警声时序 ...

  3. 单片机实例18——“嘀、嘀、……”报警声(硬件电路图+汇编程序+C语言程序)

    18. "嘀.嘀.--"报警声 1. 实验任务 用AT89S51单片机产生"嘀.嘀.-"报警声从P1.0端口输出,产生频率为1KHz,根据上面图可知:1KHZ方 ...

  4. 指尖下的js ——多触式web前端开发之二:处理简单手势

    这篇文章将描述多触式网页开发中对手势(Gesture)事件的处理.      水果设备中的Gesture,广义的说包括手指点击(click),轻拂(flick),双击(double-click),两只 ...

  5. 基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统

    这是我本科毕设搞得一个小任务,现在稍微整理了其中一点内容,下面有相应的程序代码. 程序参考: 采用STM32作为主控,通过串口与ME3616通信,控制ME3616对接OneNET,将采集到的温度数据上 ...

  6. 单管发报机的神奇之处-身兼两职

    ➤01 简易无线发报机 1.发报机演示 在头条上有一个视频,介绍了一款 简易无线发报机 ,给了一款仅仅使用一个高频硅三极管( 9018 )构成的调幅无线发报机.虽然是一个高频电路,为了说明电路的构造原 ...

  7. 传动系统结构简图_立式砂磨机与卧式砂磨机的结构特点比较

    砂磨机是精细材料制备的关键设备之一,又称珠磨机或者球磨机,国外也有将其称之为搅拌式球磨机(搅拌轴球磨机的组合).从原理上来讲,无论球磨机.砂磨机还是搅拌机,都是利用研磨介质在分散叶片的高速转动作用下赋 ...

  8. 离行式ATM机搭建数据传输VPN安全网络解决方案

    离行式ATM机是在银行营业网点之外设备的自助设备,常见于居民区.旅游景点.商场.酒店等场所.随着银行业和金融业的发展,越来越多ATM机被部署在公众场所,带来各种各样的困扰和难题,如何使用较低成本实现A ...

  9. MQ100门座起重机 双螺旋输送机总装图 减速机图纸 自动圆式焊机总装图 VF6-7空气压缩机曲轴加工工艺及夹具设计 组合机床工艺设计 RV蜗轮蜗杆减速机 90度皮带机运载机器人设计……

    MQ100门座起重机 双螺旋输送机总装图 减速机图纸 自动圆式焊机总装图 VF6-7空气压缩机曲轴加工工艺及夹具设计 组合机床工艺设计 RV蜗轮蜗杆减速机 90度皮带机 运载机器人设计 HBGL120 ...

最新文章

  1. python01-变量,运算符与数据类型+位运算
  2. hihoCoder 网络流四·最小路径覆盖
  3. 一切皆文件的编程思想
  4. UA MATH567 高维统计II 随机向量7 Grothendieck不等式
  5. 计算机网络应用基础第一章试题,计算机网络应用基础第一章测试题
  6. 转码与重定向的区别之于SpringMVC
  7. 【人工智能】【深度学习】初学者如何选出最适合自己深度学习框架?
  8. JS中SetTimeOut和SetInterval方法的区别?
  9. 异地多活设计辣么难?其实是你想多了!
  10. java+c#+json+时间_Java与C#间json日期格式互转完美解决方案
  11. apple quicktime怎么在ppt中用_只添加一个色块,你也能做出高大上的PPT排版
  12. win32 api应用如何输出日志log Windows程序设计 visualstudio vs无控制台如何输出
  13. 自组织的组织力量,数字化趋势之一
  14. 虚拟机通过无线设置静态ip连外网,不同环境的wifi照常使用
  15. Python学习笔录(四)--- 数据结构
  16. 梦幻西游手游经验任务链计算机,梦幻西游手游任务链帮派求助刷经验技巧
  17. 阿里云备案一般要多久时间?快速通过阿里云APP进行域名备案方法
  18. 国产系统部署服务器,国产服务器操作系统取得重大突破
  19. 【基础编程题目集编程题及其答案】
  20. sklearn中的决策树(分类)

热门文章

  1. 作者:李海英(1976-),女,中国信息通信研究院互联网法律研究中心主任,中国互联网协会互联网法治工作委员会副秘书长。...
  2. 数字化技术浪潮下,医院临床科研如何「华丽变身」
  3. JavaScript事件代理和委托
  4. jQuery的$(document).ready()和JavaScript onload事件
  5. C# 文件读取方法,自己写的例子,保存一下,备用
  6. shell+html+div+css实现数据库冷备文件检查
  7. 销售管理如何构成闭环?帆软大屏看板让销售数据转起来,不再分散
  8. 史上最全企业数据产品选型对比(含数仓、报表、BI、中台、数据治理)
  9. 怎样做高质量的财务分析?
  10. 从月薪8K的分析师到月薪2W,只因我有了这份工具清单!