MicroFlighter 之STM32F103學習——(2)編寫第一個STM32程序

因爲第一次接觸STM的單片機,各種寄存器和API都不熟悉,於是結合STM的庫函數和編程手冊對照理解。建立好工程之後,編寫main函數。

1.不管哪種單片機,上電以後第一重要的事就是設置時鐘和初始化引腳。單看STM32F的時鐘:

能作爲STM32F103的系統時鐘的有三種,外部時鐘,內部時鐘,PLL時鐘。

int main(void)
{
  SystemInit();
  return 0;
}
跟蹤到SystemInit裏面,一開始CPU工作於內部時鐘,代碼初始化一些時鐘寄存器的值。然後調用SetSysSClock()設置新的時鐘源。

static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
  SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();
#endif
  
 /* If none of the define above is enabled, the HSI is used as System clock
    source (default after reset) */ 
}
可以看到用戶只需要定義相應的宏就可以設定時鐘。宏定義在本文件的最上面。我使用的芯片是STM32F103C6T8,文件中定義了
SYSCLK_FREQ_72MHz

感覺STM的庫寫的不好的是如果72MHz時鐘不正常,時鐘初始化函數沒用任何返回信息,只能在STM提供的函數中增加:


有失程序的靈活性和獨立性。

而初始化代碼中的各種寄存器定義的賦值參考STM編程手冊,就明白了。主要的寄存器有這些:


2.設置GPIO:   點亮一個Led:PA3---電阻--Led--GND

int main(void)
{
  //SystemInit();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打開APB2時鐘,GPIO都是掛在APB2上的
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           // 設置IO模式(模式,速度,引腳等等)
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	GPIO_SetBits(GPIOA, GPIO_Pin_3);  // GPIOA->BSRR = GPIO_Pin_3; //置位
	
	while(1)
	{		
		GPIO_SetBits(GPIOA, GPIO_Pin_3);  // 其實就是 GPIOA->BSRR = GPIO_Pin_3;
		delay(1000);		
		GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //等價於 GPIOA->BRR = GPIO_Pin_3;
		delay(1000);
	}
	return 0;
}

Ctr+F5開始Debug,運行程序,察看效果(下載程序之後程序沒有直接執行,不知道我設置的問題還是本身就這樣子)。

後來發現可以在這裏設置:


3.使用printf函數。需要配置選項,不然的話,只要加入了printf,程序不能正常運行。 使用技巧參考 http://www.amobbs.com/thread-5061319-1-1.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章