系列文章目錄
【STM32】HAL庫(kù) 新建MDK工程
【STM32】HAL庫(kù) 串口輪詢發(fā)送
【STM32】HAL庫(kù) LED閃爍、流水燈
【STM32】HAL庫(kù) 定時(shí)器中斷
【STM32】HAL庫(kù) 外部中斷
前言
使用STM32F103C8T6開(kāi)發(fā)板,用STM32CubeMX配置FreeRTOS,可以適配正點(diǎn)原子FreeRTOS所有實(shí)驗(yàn)的基礎(chǔ)工程
一、STM32CubeMX設(shè)置
選擇芯片
配置系統(tǒng)時(shí)鐘
HAL的時(shí)基不能選擇系統(tǒng)定時(shí)器
GPIO
PA0和PA1輸出模式,驅(qū)動(dòng)兩個(gè)LED燈。
PB4、PB6和PB11輸入模式,PB1外部中斷下降沿觸發(fā),全部上拉,檢測(cè)按鍵。
定時(shí)器
定時(shí)器2和定時(shí)器3的周期設(shè)置為1秒
定時(shí)器4,設(shè)置為1000Hz的10到100倍,100倍為100000Hz。用于測(cè)任務(wù)運(yùn)行時(shí)間。
串口
用于打印信息
FreeRTOS設(shè)置
中斷
把定時(shí)器3優(yōu)先級(jí)改為6,生成工程文件后,再將定時(shí)器2優(yōu)先級(jí)改為4。
定時(shí)器1優(yōu)先級(jí)改為最高,可以在任務(wù)中使用HAL_Delay代替正點(diǎn)原子的delay_ms
設(shè)置堆空間
這款芯片的RAM空間為20k,可以設(shè)置堆空間為10k
Config parameters
Include parameters
互斥量
事件
任務(wù)
給它們?cè)O(shè)置不同的優(yōu)先級(jí)
隊(duì)列
按鍵隊(duì)列和大數(shù)據(jù)隊(duì)列
軟件定時(shí)器
單次和周期
二值信號(hào)量
計(jì)數(shù)信號(hào)量
工程設(shè)置
二、代碼
LED閃爍
void LED0_TOGGLE(void)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
}
void LED1_TOGGLE(void)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
}
void task1(void *argument)
{
/* USER CODE BEGIN task1 */
/* Infinite loop */
for(;;)
{
LED0_TOGGLE();
osDelay(500);
}
/* USER CODE END task1 */
}
void task2(void *argument)
{
/* USER CODE BEGIN task2 */
/* Infinite loop */
for(;;)
{
LED1_TOGGLE();
osDelay(500);
}
/* USER CODE END task2 */
}
串口
#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch ,1,1000);
return (ch);
}
void task1(void *argument)
{
/* USER CODE BEGIN task1 */
/* Infinite loop */
uint32_t task1_num = 0;
for(;;)
{
printf("task1_num:%d\r\n",++task1_num);
LED0_TOGGLE();
osDelay(500);
}
/* USER CODE END task1 */
}
void task2(void *argument)
{
/* USER CODE BEGIN task2 */
/* Infinite loop */
uint32_t task2_num = 0;
for(;;)
{
printf("task2_num:%d\r\n",++task2_num);
LED1_TOGGLE();
osDelay(500);
}
/* USER CODE END task2 */
}
按鍵掃描
uint8_t key_scan(uint8_t mode);
#define KEY0 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)
#define KEY1 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)
#define KEY2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define WK_UP HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11)
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
uint8_t key_scan(uint8_t mode)
{
static uint8_t key_up = 1;
uint8_t keyval = 0;
if (mode) key_up = 1;
if (key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 0))
{
HAL_Delay (10);
key_up = 0;
if (KEY0 == 0) keyval = KEY0_PRES;
if (KEY1 == 0) keyval = KEY1_PRES;
if (KEY2 == 0) keyval = KEY2_PRES;
if (WK_UP == 0) keyval = WKUP_PRES;
}
else if (KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 1)
{
key_up = 1;
}
return keyval;
}
void task3(void *argument)
{
/* USER CODE BEGIN task3 */
/* Infinite loop */
uint8_t key = 0;
for(;;)
{
key = key_scan(0);
if(key) printf("key = %d\r\n",key);
osDelay(10);
}
/* USER CODE END task3 */
}
定時(shí)器
修改定時(shí)器2的優(yōu)先級(jí)
HAL_NVIC_SetPriority(TIM2_IRQn, 4, 0);
打開(kāi)定時(shí)器中斷
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
定時(shí)器回調(diào)函數(shù),打印定時(shí)器的優(yōu)先級(jí)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-825183.html
uint32_t FreeRTOSRunTimeTicks;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
uint32_t preemptPriority, subPriority;
/* USER CODE END Callback 0 */
if (htim->Instance == TIM1) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
if (htim->Instance == TIM2) {
HAL_NVIC_GetPriority(TIM2_IRQn, NVIC_PRIORITYGROUP_4, &preemptPriority, &subPriority);
printf("TIM2_Priority:%d\r\n",preemptPriority);
}
if (htim->Instance == TIM3) {
HAL_NVIC_GetPriority(TIM3_IRQn, NVIC_PRIORITYGROUP_4, &preemptPriority, &subPriority);
printf("TIM3_Priority:%d\r\n",preemptPriority);
}
if (htim->Instance == TIM4) {
FreeRTOSRunTimeTicks++;
}
/* USER CODE END Callback 1 */
}
開(kāi)啟定時(shí)器4,用于任務(wù)運(yùn)行時(shí)間統(tǒng)計(jì)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-825183.html
void configureTimerForRunTimeStats(void)
{
HAL_TIM_Base_Start_IT(&htim4);
}
unsigned long getRunTimeCounterValue(void)
{
return FreeRTOSRunTimeTicks;
}
FreeRTOSConfig.h
#define configUSE_QUEUE_SETS 1 /* 1: 使能隊(duì)列集, 默認(rèn): 0 */
到了這里,關(guān)于【STM32】使用CubeMX快速創(chuàng)建FreeRTOS的基礎(chǔ)工程,基于正點(diǎn)原子的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!