USART外设实现printf功能 回到STM32CubeMX的配置界面,wb55-nucleo板子自带的usb串口连接在PB7和PB6上 串口外设和io口初始化由cubemx完成了,要实现一个printf功能用于后续程序调试,只需要实现fputc接口,重定向到串口上就行, 引入头文件 #include "stdio.h"fputc实现 int fputc(int ch, FILE* file) { HAL_UART_Transmit(&huart1,(uint8_t*) &ch,1,200); return ch; } //main.c中做测试: printf(" hello world uart1 config ok!\r\n"); HAL_Delay(1000);keil编译器中,需要选择use MicroLIB选项,否则串口正常运行时不会有输出,只有在debug模式下,调试时才有串口打印。 实现完成后,使用串口可以看到输出,默认配置是数据位7位。 实现Rx接收中断功能这里用的是标准库的实现思路简单验证。 STM32CubeMX的修改如下: - 在STM32CubeMx中使能USART1外设的global interrupt
- 修改中断的优先级,位置是在SystemCore的NVIC,可以先设置组优先级,再设置抢占和子优先级,stm32的优先级越大数字越小。
- 完成,重新生成代码。
在KeilMDK软件中,stm32主要在 HAL_UART_MspInit底层初始化的函数中新增了以下的代码: /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); HAL_NVIC_EnableIRQ(USART1_IRQn);代码设置了优先级并且使能了串口的中断。 要实现串口的接收,我们主要需要修改串口中断服务函数,纯中断而且比较简单的实现是:使能两个标志位,RX空闲(IDLE)和RX非空(RXNE)标志位。 在外设数据寄存器非空标志位中,把数据从Rx外设搬运进数组。 在外设空闲标志位中,我们把数组的数据直接用printf打印出来。
裸机用定时器实现简单的任务框架在很多人介绍RTOS的时候,会笼统的把裸机说成是必须要延时等待长时间任务的,以此来说明其分时高效,不浪费cpu资源的特点。 裸机实现这样的特点是可行的,核心就是用定时器的定时功能。例如按键扫描,完全是可以放在1ms中断中通过软件的计数值进行按键的消抖,长短按的识别等等。但是没有框架,纯靠堆代码,会导致各种计数值和标志位飘散在程序中,看的凌乱而且难以管理。框架的引入可以大大节省各种命名的烦恼,保证程序的可靠性。 这个任务框架有点RTOS的味道主要由****task**和**multiTimer**两个文件组成,其中multiTimer是一个底层实现,有点类似用软件实现IIC,实际用户程序不应该使用这个底层。multiTimer实现了一个定时器链表,时钟滴答计时器可以放在systick中自增,每个while循环,将轮询定时器的超时时间,定时时间到了,执行回调函数,并且自动更新下一个超时时间。** 如何使用? 要添加任务,仅需要修改任务数的宏,声明和定义一个新的函数,然后设定多少ms执行一次即可。 小结主要用wb55实现了最基础的外设驱动和功能。wb55的外设驱动起来还是比较舒服的,没有碰到太多的坑。 由于不熟悉hal库,有参考一些视频资料, 本文的代码和思路很大部分参考的一位b站大佬:hezhijie157,视频地址: STM32-HAL库速讲**哔哩哔哩bilibili**。 代码资料:链接:https://pan.baidu.com/s/1AnxLqKJnwHRSpT6cIMzV-A提取码:3mgo
|