STM32学习笔记(四)——串口控制LED(中断方式)

目录:

一、时钟使能,包括GPIO的时钟和串口的时钟使能

二、设置引脚复用映射

三、GPIO的初始化配置,注意要设置为复用模式

四、串口参数初始化配置

五、中断分组和中断优先级配置

六、设置串口中断类型并使能串口中断

七、编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号)。

八、主函数的实现。

一、时钟使能,包括GPIO的时钟和串口的时钟使能

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	//使能端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//使能串口时钟  

二、设置引脚复用映射

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
	、

  

三、GPIO的初始化配置,注意要设置为复用模式

	/*GPIO配置*/
    IO_Init.GPIO_Mode = GPIO_Mode_AF;		//配置成复用模式
    IO_Init.GPIO_OType = GPIO_OType_PP;
    IO_Init.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    IO_Init.GPIO_PuPd = GPIO_PuPd_UP;
    IO_Init.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &IO_Init);

  

四、串口参数初始化配置

	/*串口初始配置*/
    UT_Init.USART_BaudRate = 9600;		//波特率
    UT_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//无硬件控制流
    UT_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//发送接收
    UT_Init.USART_Parity = USART_Parity_No;			//无奇偶校验
    UT_Init.USART_StopBits = USART_StopBits_1;		//停止位1
    UT_Init.USART_WordLength = USART_WordLength_8b;	//数据位8
    USART_Init(USART1, &UT_Init);

  

五、中断分组和中断优先级配置

    /*中断优先级设置,中断分组*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //中断优先级分组2
    NC_Init.NVIC_IRQChannel=USART1_IRQn;        //串口1中断通道
    NC_Init.NVIC_IRQChannelCmd=ENABLE;            //使能中断
    NC_Init.NVIC_IRQChannelPreemptionPriority=0;    //抢占优先级
    NC_Init.NVIC_IRQChannelSubPriority=0;            //响应优先级
    NVIC_Init(&NC_Init);

六、设置串口中断类型并使能串口中断

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);        //配置串口中断类型,接收数据中断
    USART_Cmd(USART1, ENABLE);

七、编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号)。

void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    u8 Receive_Data = 0;
    if(USART_GetITStatus(USART1, USART_IT_RXNE))    //由于只设置了一种接收中断,判断可以省略
    {
        Receive_Data = USART_ReceiveData(USART1);//保存接收到的数据,RXNE自动清零
        printf("Receive Succsed: %2x \r\n", Receive_Data);//回复接收完成
        if(Receive_Data==0x01)
            LED0=!LED0;
        // USART_ClearFlag(USART1,USART_IT_RXNE);        //手动清零
    }
}

由于本程序只使能串口接收到数据(USART_IT_RXNE)产生中断,所以在执行中断服务函数之前可以不用判断,如果使能了多种串口中断,则要先判断产生中断的类型,注意读取数据后,RXNE寄存器自动清零,不需要再手动清零。

八、主函数的实现,这里仍然采用了LED闪烁和串口发送数据来显示程序运行状态的方法。

int main(void)
{
    LED_Init();
    delay_init(168);
    USART1_Config();
    LED0_OFF;
    LED1_OFF;
    while(1)
    {
        LED1=!LED1;
        printf("Running....\r\n");
        delay_ms(500);
    }
}

以上工作做好后,就可以将程序下载到STM32了, 可以发现LED1在闪烁,同时串口发送来了running.....当电脑发送一个0x01时LED0的状态会反转。

总结

本程序只使用了串口接收完成后产生中断,如果我们要让数据发送完成后产生中断,应该如何配置呢?方法是类似的,中断配置时只需要设置为USART_ITConfig(USART1, USART_IT_TC, ENABLE); 同样可以通过函数USART_GetITStatus(USART1, USART_IT_TC) 来判断是否产生发送完成中断。

参考资料

关于串口的使用可以参考之前发表的几篇博文:

  1. STM32学习笔记(二)——串口控制LED
  2. STM32学习笔记(三)——外部中断的使用

以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。

2017年4月18日21:42:36

时间: 2024-10-22 17:19:21

STM32学习笔记(四)——串口控制LED(中断方式)的相关文章

STM32学习笔记——USART串口(向原子哥和火哥学习)

一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. STM32 的串口资源相当丰富的,功能也相当强劲.STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作.它还允许多处理器通信.

西门子PLC学习笔记四-(控制三项异步电动机的启动停止)

本篇是学习S7-300的一个小程序,用于对PLC开发简单直观的认识. 1.三项异步电动机电路图 2.PLC控制接线图 从图中可以看出控制按钮接PLC 信号模块SM的I0.0.I0.1端口,输出信号从Q4.1输出 3.PLC SM模块选择 1)输入模块选择 SM321 DI32*24V 2)输出模块选择 SM322 DO32*AC120/230/1A 4.硬件组态图如下: 5.编辑符号变量 6.编写梯形图程序 7.编写程序 程序解释: sb1_start使用开路符号表示:当接通时整条线路都接通,默

StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起执行,期间不会插入其他的命令. 这种方式不保证事务的一致性,即使中间有一条命令出错了,其他命令仍然可以正常执行,并且无法回滚 下面的例子演示了一个基本的事务操作 127.0.0.1:6379> multi OK 127.0.0.1:6379> set name mike QUEUED 127.0.

STM32学习笔记——点亮LED

STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽式输出 7.推挽式复用功能 8.开漏复用功能 stm32GPIO模式设置相关寄存器设置的介绍 stm32中文参考手册中对GPIO模式设置对应寄存器的详细介绍: 下图为开发板LED的接线图: 根据上面的电路图可知,将GPIOB

【Unity 3D】学习笔记四十六:输入与控制——键盘事件

在游戏中,玩家控制主角移动,按键攻击,选择行走.都需要在程序中监听玩家的输入.unity为开发者提供了input库,来支持键盘事件,鼠标事件以及触摸事件.本文主要回顾键盘事件,以后会逐文复习鼠标以及触摸事件. 键盘事件 一般的PC键盘有104个不同的按键,在程序中通过监听这些按键事件,从而进一步执行逻辑操作.如:射击游戏中,W表示前进,S表示后退,A表示左移,D表示右移. 按下事件 在脚本中,用input.GetKeyDown( )方法将按键值作为参数,监听此按键是否被按下.按下返回true,否

STM32学习笔记3(TIM输入捕获)

PWM 输入捕获模式< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 一.概念理解 PWM输入捕获模式时输入捕获模式的特例 1.每个定时器有四个输入通道IC1.IC2.IC3.IC4,且IC1 IC2一组,IC3 IC4一组,并可是设置管脚和寄存器的对应关系 2.两个TI输出映射了两个ICx信号 3.这两个ICx信号分别在相反的极性边沿有效 4.两个边沿

STM32学习笔记6(TIM通用模块生成PWM)

1.     TIMER输出PWM基本概念   脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是对脉冲宽度的控制.一般用来控制步进电机的速度等等. STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出. 1.1   PWM输出模式 S

STM32学习笔记——OLED屏

STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.  多种接口方式,该模块提供了总共 5 种接口包括: 6800. 8080 两种并行接口方式. 3线或4线的SPI接口,IIC接口方式 5.  不需要高压,直接接3.3V就可以工作:(可以与stm32的引脚直接相接) OLED图片: OLED引脚介绍: CS:OLED片选信号 RST:OLED复位端口

STM32学习笔记之一(初窥STM32)

怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个什么东西(如:寄存器---寄存东西(数据)的地方嘛) 学习知识--有了自我感知后,就需要验证自己的感知是否正确,请记住,带着自己思想的学习是最高效的学习(如:寄存器---存什么东西呢?) 归纳总结--学习了大量知识后,就该汇总汇总了(如:寄存器---存数据(通用寄存器),存命令(PC),存地址(LR)) 自我