随记~!
STM32CubeIDE运行环境友好,功能丰富,更新迅速,相比之前的keil等stm32开发环境要好很多,但是每一个新环境都有自己的坑。。。。
1.CAN外设
CAN在配置Cube环境时并没有滤波器选项,若不进行配置,则不能正常收发数据,需要在初始化函数完成后调用HAL_CAN_ConfigFilter函数完成滤波器配置。
配置时在光勾选收发中断是无法进入CAN中断的,还需要手动开启CAN中断(__HAL_CAN_ENABLE_IT),并使能CAN(HAL_CAN_Start)才能正常进入中断。后面的中断操作就跟串口差不多了。官方未提供CAN的中断收发历程。。。。
CAN的中断操作主要在3个发送完成回调和4个接收回调中完成。
2.定时器
定时器作为普通定时器使用时需要手动开启 HAL_TIM_Base_Start_IT 定时器中断,切记!!!!无论是否勾选定时器中断,定时器中断的处理可以统一在 HAL_TIM_PeriodElapsedCallback 函数中完成。
定时器作为PWM输出时,有几个操作步骤:
1> 定时器初始化
PWM互补输出时,无论如何配置Cube,互补端均无法输出,参照库文件,发现互补输出端就没有使能,只能手动添加
htim1.Instance->CCER |= TIM_CCER_CC1NE,这句话使能了通道1的互补输出段端。
2> PWM输出控制
HAL_TIM_PWM_Start 和 HAL_TIM_PWM_Stop 函数就可以,算是库函数难得支持了。
3> 占空比控制
找遍了整个库函数均没有发现比较明显的函数能干这个事 ,总觉得这个事应该经常用的啊,没办法,只能调用宏定义实现(__HAL_TIM_SET_COMPARE),这个宏貌似 也不是干这个的。
3.片上flash
这个简单,至少不用初始化。
but,切记(HAL_FLASH_Unlock)and(HAL_FLASH_Lock),切记单线程访问,注意中断现场保护,这样安全些。
现场保护是这样的,在很多地方都会用到,类似于ucos的(OS_ENTER_CRITICAL() )和 (OS_EXIT_CRITICAL() )
uint32_t ulReturn;
if (__get_IPSR() != 0)ulReturn = taskENTER_CRITICAL_FROM_ISR();
else taskENTER_CRITICAL();
//需要保护的东西
if (__get_IPSR() != 0)taskEXIT_CRITICAL_FROM_ISR( ulReturn );
else taskEXIT_CRITICAL();
flash擦除函数(HAL_FLASHEx_Erase)和编程函数(HAL_FLASH_Program),在访问频繁是时可能出现操作失败的情况具体原因不慎清楚,我的做法是判断返回值,直到操作成功为止。
为了生成烧录文件,需要做以下设置。
工程右键》Properties》C/C++ Build 》Settings 》
找到Build Steps选项卡,在“Post-build steps”的“Command”输入以下命令
生成hex:
arm-none-eabi-objcopy "${ProjName}.elf" -O ihex "${ProjName}.hex"
生成bin:
arm-none-eabi-objcopy "${ProjName}.elf" -O binary "${ProjName}.bin"