一名物聯網創業者的創業筆記-2-打造瑞士軍刀-STM32開發除錯程式碼
阿新 • • 發佈:2018-11-08
本專案中採用了STM32F103RCT6,因此,在PCB完成製作之前,有必要把STM32F103RCT6的驅動程式碼捋一遍,以便後續開發時,不需要在驅動上,太過耗費時間。所以這些驅動工程,就類似於一把把瑞士軍刀,可以非常方便地實現各類需要實現的功能。
從箱子中找出來以前使用的開發板。選擇這一款開發板的主要原因是,這個開發板和專案的板子上,用了同款MCU。
下面,將MCU上門的主要驅動捋一遍,以便在專案開發上覆用。這裡程式碼多源自於開發板,在此僅做梳理,以便後續專案回溯時,汲取一些經驗。
延時
延時初始化僅僅需要2行程式碼,這裡定義了fac_us。其中STM32採用8M時鐘,系統預設倍頻為9倍,因此係統預設時鐘為72MHz, 經過Div8, 也就是8分頻後,SysTick為9MHz; SystemCoreClock為
fac_us = 9000000/8000000, 為1.125
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //HCLK/8
fac_us=SystemCoreClock/8000000; //SYSTEMCLOCK/8
fac_ms=(u16)fac_us*1000; //ms延時時間
}
us延時
通過SysTick實現us延時
void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //設定SysTick.LOAD為初始值 SysTick->VAL=0x00; //VAL清零 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //CTRL設定,開始倒計時 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器 SysTick->VAL =0X00; //清空計數器 }
ms延時
void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //載入延時時間,單位ms SysTick->VAL =0x00; //清空計數器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始計時 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //計時時間到 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //停止計時 SysTick->VAL =0X00; //清空計數器 }
GPIO操作
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //初始化GPIO對應時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIO初始化:pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO初始化:Mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO初始化:Speed
GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIO初始化;
GPIO_SetBits(GPIOA,GPIO_Pin_8); //SetBits
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //Pin
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化
GPIO_SetBits(GPIOD,GPIO_Pin_2); //SetBits
}