本篇文章是在蓝桥杯嵌入式-任务调度器完整的项目下补充完成的。如果需要代码,直接看第四部分的下载链接。

一、STM32CubMX配置

在这里插入图片描述

二、代码方面

2.1 main.c

2.1.1 修改位置

在这里插入图片描述

2.1.2 对应代码
    GPIOC -> ODR |= 0xFF00;
    GPIOD -> BSRR |= 0x01 << 2;
    GPIOD -> BRR |= 0x01 << 2;

2.2 task.c

2.2.1 修改位置

在这里插入图片描述

2.2.2 对应代码
uint8_t ucLed[8];

void led_disp(uint8_t *ucLed)
{
    uint8_t temp = 0x00;
    static uint8_t temp_old = 0xff;

    for (uint8_t i = 0; i < 8; i++)
        temp |= (ucLed[i] << i);
        
    if (temp_old != temp)
    {
        GPIOC->ODR &= 0x00FF;
        GPIOC->ODR |= ((uint16_t)(~temp) << 8);
        GPIOD->BSRR = GPIO_PIN_2;
        GPIOD->BRR = GPIO_PIN_2;
        temp_old = temp;
    }
}
  
void led_proc(void)
{
    led_disp(ucLed);
}

task_t scheduler_t[] =
{
    {led_proc, 10, 0}  
};

三、部分考点介绍

3.1 点亮一个LED

3.1.1 修改位置

在这里插入图片描述

3.1.2 对应代码
void led_proc(void)
{
    ucLed[0] = 1; // 点亮第一个LED
	ucLed[7] = 1; // 点亮第八个LED
    led_disp(ucLed); // 更新LED显示
}

3.2 LED灯闪烁

3.2.1 修改位置

在这里插入图片描述

3.2.2 对应代码
uint32_t led_start_time = 0;//保存上一次闪烁时间(注意:变量类型必须用uint32_t,与uwTick类型匹配)
void led_proc(void)
{
    // LED灯闪烁 - 每1000ms切换一次状态
    if(uwTick - led_start_time >= 1000)  // 闪烁间隔1000ms,周期2000ms(亮1000ms,暗1000ms)
    {
        ucLed[2] ^= 1;        // 切换LED2状态(异或操作:0变1,1变0)
        led_start_time = uwTick;  // 更新切换时间
    }
	
    led_disp(ucLed); // 更新LED显示
}

四、其他

4.1 STM32CubMX单个引脚配置

在这里插入图片描述
在这里插入图片描述

4.2 完整代码下载

资料下载:https://pan.quark.cn/s/08f8e6116512

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐