欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

STM32嘀!嘀!嘀!点触式发报机

发布时间:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的这篇文章主要介绍了 STM32嘀!嘀!嘀!点触式发报机 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

主要用到三部分的内容,

  • GPIO控制LED灯的亮灭
  • EXTI外部按键触发中断,在中断中控制串口的使能
  • 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时钟)

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

  • 配置外部中断的GPIO
  • 配置NVIC
  • 配置EXTI
  • 书写中断服务函数
  • 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配置来说相对比较好记忆:

  • USART中GPIO的配置
  • USART的配置
  • 编写发送的函数
  • 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嘀!嘀!嘀!点触式发报机的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。