STM32+FreeRTOS使用笔记1

发布时间 2023-04-16 12:58:53作者: zhuqingzhu

start

实验配置:

1.开发板用的是STM32F103C8T6的处理器,板上LED是接到GPIO PC13

2.扩展板上使用的是TM1638来驱动数码管显示,开发板使用GPIO PA00/01/02 驱动扩展板的 STB/CLK/DIO

3.通过STM32CubeMX自动创建包含FreeRTOS的Keil工程

4.创建3个Task,分别用来:串口输出 、 开发板上的LED闪烁 、 扩展板上面的数码管显示00-FF

使用STM32CubeMx自动创建代码

 

选择芯片

 

配置SYS

 

配置USART1,用来作为串口输出()

 

 

配置GPIO(用来驱动LED和数码管)

配置FREERTOS并创建3个Task

使用Keil-MDK打开工程

加入数码管的驱动代码

//
// Display_TM1638.c
// #include "gpio.h"//#define GPIO_g GPIOA #define STB GPIO_PIN_0 //??? #define CLK GPIO_PIN_1 #define DIO GPIO_PIN_2 // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); // HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); // gong yin ji // 0 1 2 3 4 5 6 7 8 9 A b C d E F unsigned char dis[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71}; void TM1638_Write(unsigned char Data); void Write_Command(unsigned char Command); void Write_Data(unsigned char add,unsigned char Data); void init_TM1638(void); void DisplayXX(unsigned int Data); // void TM1638_Write(unsigned char Data) { unsigned char i; for(i=0;i<8;i++) { HAL_GPIO_WritePin(GPIOA,CLK,GPIO_PIN_RESET); //CLK=0; if(Data&0x01) HAL_GPIO_WritePin(GPIOA,DIO,GPIO_PIN_SET); //DIO=1; else HAL_GPIO_WritePin(GPIOA,DIO,GPIO_PIN_RESET); //DIO=0; Data>>=1; HAL_GPIO_WritePin(GPIOA,CLK,GPIO_PIN_SET); //CLK=1; } } // void Write_Command(unsigned char Command) { HAL_GPIO_WritePin(GPIOA,STB,GPIO_PIN_RESET); //STB=0; TM1638_Write(Command); HAL_GPIO_WritePin(GPIOA,STB,GPIO_PIN_SET); //STB=1; } // void Write_Data(unsigned char add,unsigned char Data) { HAL_GPIO_WritePin(GPIOA,STB,GPIO_PIN_RESET); //STB=0; TM1638_Write(0xC0|add); TM1638_Write(Data); HAL_GPIO_WritePin(GPIOA,STB,GPIO_PIN_SET); //STB=1; } // void init_TM1638(void) { unsigned char i; Write_Command(0x8F); // liang du 设置亮度最亮 Write_Command(0x40); // di zi zhi dong +1 初始化的时候设置地址自动加 1 HAL_GPIO_WritePin(GPIOA,STB,GPIO_PIN_RESET); //STB=0; TM1638_Write(0xc0); //base add for(i=0;i<16;i++) //set 8 display no display 当前是地址自动加 1 mode,,循环设置8个数码管不显示 TM1638_Write(0x00); HAL_GPIO_WritePin(GPIOA,STB,GPIO_PIN_SET); //STB=1; } void DisplayXX(unsigned int Data) { unsigned char i; unsigned char x; unsigned char y; TM1638_Write(0x44); // cai yong gu ding di zhi 关闭地址自动加 1,使用固定地址模式 x = (Data>>4) & 0x0F; // shi wei y = Data & 0x0F; // ge wei for(i=0;i<16;i++) { if(x == i) Write_Data(0x0,dis[i]); // 1st display 十位显示在第一个数码管 if(y == i) Write_Data(0x2,dis[i]); // 2st display 个位显示在第二个数码管 } }

修改Freertos.c文件

添加下面代码:

在3个Task的Entry Function里面添加Task的功能代码:

 //

 //

修改Target

使用FlyMcu通过串口ISP烧录

烧录的时候需要把 BOOT0接1,BOOT1接0

烧录成功之后把 BOOT0接0,BOOT1不接,可以看到:

1.LED闪烁

2.数码管显示00-FF

3.串口有打印

代码结构

main()函数的内容(xTaskCreate()就是FreeRTOS创建任务的接口)

 

xTaskCreate()接口的基本架构:Task使用数据结构TCB_t来表示,并通过链表来存放

 

end