一. 主程序分析
主程序结构清晰,流程如图所示,下面将对每个部分做详细分析
二. 系统初始化
系统初始化部分的流程如上图所示,下面对每部分做具体分析
1. 时钟初始化
该部分主要是使能DWT,用DWT进行精确延时,没有使用systick进行延时是因为systick作为时基用来确定各任务的运行频率
2. 初始化各参数到EEPROM
系统使用FLASH的最后一页模拟EEPROM来存储参数
// use the last KB for sensor config storage #define FLASH_WRITE_EEPROM_CONFIG_ADDR (0x08000000 + (uint32_t)FLASH_PAGE_SIZE * (FLASH_PAGE_COUNT - 1))
将各参数初始化,然后写入flash,写入flash步骤如下:
①FLASH解锁
②清零EOP、PGERR、WRPRTERR标志位
③进行擦除
④如果擦除完成就进行编程
⑤FLASH上锁
⑥读取FLASH
3. 电机驱动初始化
该函数一开始就检查一个标志位(全局静态变量),该标志位默认清零,在本函数执行完后置位,确保本函数只执行一次。
该部分用到了二个高级定时器TIM1和TIM8,还有二个通用定时器TIM4和TIM5,因此把定时器部分的初始化函数独立出来做成二个函数,分别是高级定时器初始化和通用定时器初始化,中断配置部分也独立出来,用了很贴近库函数的写法,值得借鉴。
TIM1用于pitch pwm timer,TIM8用于roll pwm timer,TIM4和TIM5用于yaw pwm timer,在中断配置的时候,yaw pwm timer配置的是TIM5,而在配置计数初值的时候,配置的是TIM4。
TIM8->CNT = timer4timer5deadTimeDelay + 5 + PWM_PERIOD * 2 / 3; TIM1->CNT = timer4timer5deadTimeDelay + 3 + PWM_PERIOD / 3; TIM4->CN