
最近使用STM32 cube 固件库进行开发,使用的软件开发工具为SW4STM32和STM32CubeMX ,发现使用官方的cube 新库有一个最大的好处就是能使用STM32CubeMX进行工程初始化的配置工作,非常直观的图形化操作,特别是各种系统时钟的配置。同时,还能直接生成支持各种主流开发工具的工程,而且各种外设的初始化代码也能帮你生成,不过,虽然帮忙省了很多事,但是毕竟是个辅助软件工具,生成的工程文件还是或多或少的有一些瑕疵,这就要在开始时候对各种外设认真的配置,目前主要发现有以下几点需要注意的地方:
生成的初始化代码散落各处,需要对于后期修改不好查找,这也是Cube库的比较繁琐的地方,因为它有专门的硬件初始化函数,所以要么慢慢去适应,要么对相关代码按照自己的方式组织好。
对于生成的SW4STM32工程直接编译会发现报错,原因为 __weak=__attribute__((weak)) 和 __packed=__attribute__((__packed__)) 这两个编译定义出错,正确修改应该给这两条定义加上单引号,如下图所示:
?
在使用STM32Cube库文件会用到系统嘀嗒作为HAL_Delay()函数的定时器,所以在使用STM32CubeMX配置有FreeRTOS的工程时应该给FreeRTOS选择一个Timer定时器作为其系统主定时器,这样HAL_Delay()函数和RTOS中的延时函数不相冲突。
工程的FreeRTOS配置文件在inc 目录下的 FreeRTOSConfig.h 中设置,一些设置使用默认配置就行,以下讲解一些对工程有主要影响的配置:

configMINIMAL_STACK_SIZE 一个任务最小堆栈大小,默认为128。由于FreeRTOS 中定义单位为4个byte,所以相当于128 * 4个字节大小。
configTOTAL_HEAP_SIZE 这个很关键,用于设置系统总的堆栈大小,单位为字节。需要注意的是系统占用的堆栈大小应该比所有任务占用的堆栈和要大一点点,因为系统自身任务调度也需要占用一些空间。这个数值小了创建任务失败,或者创建任务成功但是任务不运行。
configLIBARY_LOWEST_INTERRUPUT_PRIORITY 这个是系统任务最低的中断函数等级,这个值就是系统时钟的中断优先级,这个对应STM32的系统中断优先值。
configLIBARY_MAX_SYSCALL_INTERRUPT_PRIORITY 和上一个配置对应,系统任务最高的中断函数等级。这两个配置会影响一些需要用到信号量和消息队列的中断函数,要是有带有中断安全的系统函数必须将这些中断的优先级设置在这两个值之间,比如,系统默认设置为configLIBARY_LOWEST_INTERRUPT_PRIORITY = 15 configLIBARY_MAX_SYSCALL_INTERRUPT_PRIORITY = 5 ,当中断函数需要使用信号量或者消息队列等系统函数时,这些中断必须设置为5 ~ 15的中断等级。如以下代码片段:
xSemaphoreGiveFromISR( rs485->recv_sema, &xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken == pdTRUE )
{
portYIELD_FROM_ISR (xHigherPriorityTaskWoken);
//portEND_SWITCHING_ISR();
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-33609-1.html
你信不信到时候美国会毫不犹豫的第三次揍你
已经是我们绝对的胜利了
有本事一楼不用天猫京东