一:使用STM32cube MX软件创建工程1.1:LED灯 GPIO口的配置
LED1 <------>PE1
LED2 <------>PD0
这里查看原理图,将IO口置高就可以,在cube MX软件中,将GPIO口设置成输出模式就可以。
操作函数如下所示:
- HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_1);
复制代码 1.2:板载按键调试可以实现外部中断的功能
可以看到用户按键使用的引脚是PE0,这里我们使用中断线0 就可以了,同时配置成上升沿有效。
调用函数如下所示:
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- if(GPIO_Pin == GPIO_PIN_0)
- {
- HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_0);
- }
- }
复制代码 1.3 与调试器相连的串口2由于开发板没有外接屏幕,为了方便看到采集到的传感器数据,这里我使用的是串口2,同时也可以使用重映射串口2实现printf的函数,输出调试信息。
可以看到这里使用的是串口2,然后在原理图中找到使用的实际引脚;
USART2_TXD <---------------------> PD5
USART2_RXD <---------------------> PD6
STM32 cube MX软件配置:
串口2的重映射功能如下所示:
- int fputc(int ch, FILE *f)
- {
- HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
- return ch;
- }
复制代码 1.4 定时器6的调试过程这里使用定时器6,完成项目基本的任务调度;
这里配置定时器6,每1ms中断一次。
二:移植时间调度函数2.1 任务标记函数
- void Task_Marks_Handler_Callback(void)
- {
- char i;
- for(i=0; i<Tasks_Max; i++)
- {
- if(Task_Comps[i].TIMCount) /* If the time is not 0 */
- {
- Task_Comps[i].TIMCount--; /* Time counter decrement */
- if(Task_Comps[i].TIMCount == 0) /* If time arrives */
- {
- /*Resume the timer value and try again */
- Task_Comps[i].TIMCount = Task_Comps[i].TRITime;
- Task_Comps[i].Run = 1; /* The task can be run */
- }
- }
- }
- }
复制代码 2.2 任务处理函数:
- void Task_Pro_Handler_Callback(void)
- {
- char i;
- for(i=0; i<Tasks_Max; i++)
- {
- if(Task_Comps[i].Run) /* If task can be run */
- {
- Task_Comps[i].Run = 0; /* Flag clear 0 */
- Task_Comps[i].TaskHook(); /* Run task */
- }
- }
- }
复制代码 2.3 定义几个时间任务:
- static TASK_COMPONENTS Task_Comps[]=
- {
- {0, 1000,1000, task_1000ms}, //task 1 Period: 1000ms
- {0, 100,100, task_100ms}, //task 2 Period: 100ms
- };
复制代码 三:实际测试如下:在100ms任务中和1000ms 任务中添加对LED灯的闪烁和串口输出函数。如下所示
- void task_1000ms(void)
- {
- HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_1);
- }
- void task_100ms(void)
- {
- printf("stm32l4R9 board!!!!");
- }
复制代码
|