蓝桥杯嵌入式(一)程序框架和调度器
链接: 视频出处
序、代码命名规则
以下是一些常见的举例
零、STM32和8051
链接: 8位和32位单片机最本质区别
⼀、软件及环境安装
链接: 安装过程
别忘了这个
⼆、⼯程框架搭建
1.时钟配置
2、SYS配置
一般要配置,不然芯片可能烧了一次烧不进去了。
蓝桥杯这里可以不选,有自带的下载器接口,用了一个DAP去下载,不需要配置调试器。
3、⼯程配置
选1.4.0,比赛要求用这个版本
4、NVIC配置
把滴答定时器配置成最高优先级
5.、Keil配置
后续命名有所不同,APP即为MyAPP
三、系统初始化
钥匙是PD2,地址是PC
PC0到PC7不变,PC8到PC15变
前两句是准备数据,后面是锁存器打开,锁存器关闭。上面代码有误,纠正一下。
void system_init(void)
{
//清除 GPIOC 高 8 位的输出数据寄存器,保留低 8 位
GPIOC->ODR &= 0x00ff;
//将 GPIOC 高 8 位的输出数据寄存器设为高电平,接VCC为1熄灭
GPIOC->ODR |= 0xFF00;
//置位 GPIOD 的第 2 位
GPIOD->BSRR |= 0x01<<2;
//复位 GPIOD 的第 2 位
GPIOD->BRR |= 0x01<<2;
}
四、任务调度器
链接: 从计算机底层认识指针!深⼊理解C语⾔指针!
以下是scheduler.c里的内容示例
#include "scheduler.h"
typedef struct{
void(*task_func)(void);
uint32_t rate_ms;
uint32_t last_run;
}task_t;
uint8_t task_num;
void led_proc()
{
}
static task_t scheduler_task[] =
{
{led_proc,1,0}
};
//初始化函数
void scheduler_init()
{
task_num = sizeof(scheduler_task)/sizeof(task_t);
}
//调度器函数
void scheduler_run()
{
for(uint8_t i = 0; i < task_num; i++)
{
uint32_t now_time = HAL_GetTick();
if(now_time>=scheduler_task[i].rate_ms+scheduler_task[i].last_run)
{
scheduler_task [i].last_run = now_time;
scheduler_task[i].task_func();
}
}
}
在main.c里的
具体框架见链接: 视频出处