STM32 Nucleo初级例程4:串口驱动实现(中断方式接收)

作者: fengye5340
上传时间为: 2014-12-08 05:27 PM

       在上一篇文章中,讲解了在STM32-NUCLEO-072RB开发平台上利用软件查询方式实现字符发送和接收的例程。在不加入RTOS时,采用查询方式会占用CPU的消耗,使得MCU的处理效率变低。为了实现多任务运行,在不增加RTOS的方式下,尽量采用中断的方式去处理各种突发事件,主循环中仅执行必要的任务扫描工作。这一篇文章讲解利用中断方式实现串口数据的接收和发送。对于“中断”概念和内容,不做介绍,这里讲解一下cortex-m0内核的NVIC模块和KEIL-MDK工程代码的实现过程。

一、嵌套向量中断控制器(NVIC

        它与cortex-m0内核有很深的“亲密接触”——与内核是紧耦合的。NVIC提供如下的功能:可嵌套中断支持,向量中断支持, 动态优先级调整支持, 中断延迟大大缩短和中断可屏蔽。它用于整个内核中断的管理,支持32个可屏蔽中断通道(不含M0内核16个中断线)和4个可编程中断优先级(使用2位)。

   在STM32软件包带有的CMSIS软件库函数中,提供了NVIC的相关定义。

  

每个通道的具体定义如下:

这些通道的优先级都是固定的,内核中断,具有很高的优先级。不能由软件来设置

下面这些是32个外设通道,他们的优先级是可以设定的,但所有的优先级都比M0内核中断要低。

下面看一下,如何利用中断方式实现出串口数据的接收

二、Keil-mdk工程软件代码实现

1、Keil-mdk工程模板中加入NVIC.C文件, 在includes.h文件中加入NVIC.H头文件

2、实现Nvic_Init()中断配置代码

定义一个结构体变量,然后中断通道设置为串口1,优先级设置为0,在32个外设中断中是最高优先级。

3、串口接收中断服务函数实现

stm32f0xx_it.c文件的串口中断服务函数里面,实现MCU接收字符后,根据字符来判定,实现LED灯的开关。

在串口中断服务函数中,当串口接收到字符0xAA后,就打开LED灯,当接收到字符0xBB后,就关闭LED灯。实现了PC机上串口调试助手控制LED的开关。理解这个思路,当然可以控制MCU搭载或者驱动的任何负载,包括电机正转、反转,电磁阀开关,继电器开关,将串口助手集成到上位机软件中,就是一个完整的控制系统了。

4、main.c文件代码配置

将main.c文件中,将NVIC初始化代码加载,并在串口初始化代码中,打开中断接收使能位,就可以实现上述功能了。这样,MCU执行完打印字符后,就进入空循环,等待串口中断发生。

实现现象如下:

STM32-NUCLEO-072RB硬件实物连线图如下:

因为演示电脑不能成功安装ST-LINKV2-1仿真器驱动,只好用外部ST-LINKV2仿真器下载和仿真程序,USB转TTL线是自己制作。

代码地址链接

http://www.eeboard.com/bbs/thread-39696-1-1.html

摩尔吧视频地址链接

http://www.moore8.com/courses/306


全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示