目录:

一、时钟使能,包括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=; //抢占优先级
NC_Init.NVIC_IRQChannelSubPriority=; //响应优先级
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 = ;
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();
USART1_Config();
LED0_OFF;
LED1_OFF;
while()
{
LED1=!LED1;
printf("Running....\r\n");
delay_ms();
}
}

以上工作做好后,就可以将程序下载到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

欢迎大家关注我的个人博客
微信扫码关注我的公众号

不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!

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

  1. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  2. STM32学习笔记——USART串口

    转载自:http://www.cnblogs.com/microxiami/p/3752715.html 一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异 ...

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

    一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. S ...

  4. STM32学习笔记(三)——外部中断的使用

    开发板芯片:STM32F407ZGT6 硬件连接:PE3-KEY1 一.STM32F4的中断介绍 STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断. ST ...

  5. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  6. STM32学习笔记(四) RCC外设的学习和理解

    RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识.但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的 ...

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

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  8. STM32学习笔记之EXTI(外部中断)

    參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...

  9. STM32学习笔记:为什么使用外部中断要打开syscfg时钟?

    AFIO时钟只是在STM32F1系列里被提及. 对于32F1系列,涉及到管脚的EXTI. REMAP.事件输出时就需要开启AFIO时钟. 比方上面提到的管脚REMAP,必须先开AFIO时钟.配置EXT ...

随机推荐

  1. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  2. 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 566  Sol ...

  3. C#7的9个新语法

    一.out变量 在c#7之前我们得这样 在c#7中我们可以这样 当然你还可以使用"var" 这算一个小更新,其实这个问题存在很久了,应该也很好解决,不知为何到c#7才开始引入,不管 ...

  4. Redis-port安装使用实现redis迁移codis,以及简单redis pipe实现将mysql迁移redis

    (0)Redis-port原理: 首先是看到下面这篇文档开始研究的redis-port http://www.itnpc.com/news/web/146085373656602.html  简要截图 ...

  5. MySQL查看修改存储引擎总结

    文总结了MySQL下查看.修改存储引擎的一些方法.测试.验证环境为MySQL 5.6 1:查看MySQL的存储引擎信息 1.1 使用show engines命令. .csharpcode, .csha ...

  6. 使用Java语言开发微信公众平台(四)——图文消息的发送与响应

    在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...

  7. dos中进入其他盘中的方法

    1.在dos中进入其他盘中直接-->e: 即可,若是进入文件夹中-->cd aaa\bbb 即可. 2.返回上级目录:-->cd..

  8. (转)cacti无图无数据等常见问题排查

    推荐阅读:零基础学习Nagios http://www.51ou.com/browse/nagios/52001.htmlNagios安装配置教程 http://www.51ou.com/browse ...

  9. 开始学习yii2第一天

    今天在朋友圈看到一条转发,内容是根据招聘网站的要求,列举了需要一个php工程师具体需要哪些技能 框架要求是yii2 出现的最多 已经出来工作了快半个月了,感觉工资还是少的可怜,而且我也好想去张江, 所 ...

  10. 妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析

    从博主学习前端一路过来的经历了解到,前端移动开发是大部分从PC端转战移动端的小伙伴都非常头疼的一个问题,这边博主就根据一篇自己看过的移动开发文章来剖析一下网易和淘宝的rem解决方案,希望能够帮助到一些 ...