1、參考
安富萊FREERTOS教程(F103)、安富萊F4系列BSP庫(kù)、戰(zhàn)艦原理圖
相關(guān)產(chǎn)出:如何添加HA庫(kù)相關(guān).C.H文件
2、硬件平臺(tái)
正點(diǎn)原子-戰(zhàn)艦平臺(tái),keil。
3、移植目標(biāo)
將F4的HAL,BSP代碼庫(kù)移植到F1中。同時(shí)完成FreeRTOS移植,并通過串口將FreeRTOS的線程運(yùn)行狀態(tài)通過串口打印出來。
4、移植過程
通過CUbemx軟件創(chuàng)建F103標(biāo)準(zhǔn)模板文件,通過《安富萊FREERTOS教程(F103)》、安富萊F103FREE例程將相關(guān)源碼進(jìn)行復(fù)制,實(shí)現(xiàn)FreeROTS移植。移植完成之后,通過設(shè)置GPIO引角點(diǎn)亮LED燈,檢測(cè)移植是否完成。(備注:本次所使用的代碼,在GPIO外設(shè)上使用的BSP庫(kù),也可以不使用直接使用HAL庫(kù)在線程里面控制)
有了模板之后,通過參考《安富萊F4系列用戶手冊(cè)》,安富萊F4BSP庫(kù)代碼,將BSP庫(kù)移植到戰(zhàn)艦開發(fā)板中,在移植過程中主要修改一下內(nèi)容:
1、key相關(guān),同時(shí)LED文件也需要相關(guān)的修改,和key。c文件差不多,關(guān)于串口文件,只需要將文件移植過去之后,修改至編譯通過即可。
#define HARD_KEY_NUM 1 /* 實(shí)體按鍵個(gè)數(shù) */
#define KEY_COUNT (HARD_KEY_NUM + 0) /* 4個(gè)獨(dú)立建 + 2個(gè)組合按鍵 */
/* 使能GPIO時(shí)鐘 */
#define ALL_KEY_GPIO_CLK_ENABLE() { \
__HAL_RCC_GPIOA_CLK_ENABLE(); \
__HAL_RCC_GPIOE_CLK_ENABLE(); \
};
/* GPIO和PIN定義 */
static const X_GPIO_T s_gpio_list[HARD_KEY_NUM] = {
// {GPIOE, GPIO_PIN_2, 0}, /* K1 */
{GPIOE, GPIO_PIN_3, 0}, /* K2 */
// {GPIOE, GPIO_PIN_4, 0}, /* K3 */
// {GPIOA, GPIO_PIN_0, 1}, /* K4 */
};
/*一下需要注意一下,安富萊在板子上添加了上拉電阻,但是戰(zhàn)艦的板子沒有添加,在按鍵初始化的時(shí)候,需要根據(jù)實(shí)際情況設(shè)置上拉和下拉*/
static void bsp_InitKeyHard(void)
{
GPIO_InitTypeDef gpio_init;
uint8_t i;
/* 第1步:打開GPIO時(shí)鐘 */
ALL_KEY_GPIO_CLK_ENABLE();
/* 第2步:配置所有的按鍵GPIO為浮動(dòng)輸入模式(實(shí)際上CPU復(fù)位后就是輸入狀態(tài)) */
gpio_init.Mode = GPIO_MODE_INPUT; /* 設(shè)置輸入 */
gpio_init.Pull = GPIO_PULLUP; /* 上下拉電阻不使能 */
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH; /* GPIO速度等級(jí) */
for (i = 0; i < HARD_KEY_NUM; i++)
{
gpio_init.Pin = s_gpio_list[i].pin;
HAL_GPIO_Init(s_gpio_list[i].gpio, &gpio_init);
}
// gpio_init.Pull = GPIO_PULLDOWN; /* 上下拉電阻不使能 */
// gpio_init.Pin = s_gpio_list[3].pin;
// HAL_GPIO_Init(s_gpio_list[3].gpio, &gpio_init);
}
2、定時(shí)器相關(guān),在系統(tǒng)進(jìn)行監(jiān)測(cè)線程的時(shí)候需要一個(gè),更短時(shí)間間隔的計(jì)數(shù),在這里使用定時(shí)器實(shí)現(xiàn)。在bsp_timer_pwm.c文件只使用到了bsp_SetTIMforInt();該函數(shù),在編譯時(shí)會(huì)有報(bào)錯(cuò),將報(bào)錯(cuò)注釋掉即可。同時(shí)編寫相關(guān)的中斷函數(shù),實(shí)現(xiàn)ulHighFrequencyTimerTicks的計(jì)數(shù)。
/*
*********************************************************************************************************
* 函 數(shù) 名: vSetupTimerTest
* 功能說明: 創(chuàng)建定時(shí)器
* 形 參: 無
* 返 回 值: 無
*********************************************************************************************************
*/
void vSetupSysInfoTest(void)
{
bsp_SetTIMforInt(TIM6, timerINTERRUPT_FREQUENCY, timerHIGHEST_PRIORITY, 0);
}
/*
*********************************************************************************************************
* 函 數(shù) 名: TIM6_IRQHandler
* 功能說明: TIM6中斷服務(wù)程序。
* 形 參: 無
* 返 回 值: 無
*********************************************************************************************************
*/
void TIM6_IRQHandler( void )
{
if((TIM6->SR & TIM_IT_UPDATE)!= RESET)
{
ulHighFrequencyTimerTicks++;
TIM6->SR = (uint16_t)~TIM_IT_UPDATE;
}
}
5、最后效果