★ 可以直接複製貼上到 C 語言開發環境中,此程式碼可以直接編譯執行(只要你配置好開發環境與硬體)。
/*
* 名稱:STM32F4 入門:SysTick 系統時鐘
*
* 作者:黃彥霖
* 來源:http://lolikitty.pixnet.net
*
* 你需要非常精確的定時,請照以下操做:
* 如果你使用外部震盪器為 8 MHz 則請你先檢查(其他頻率同理):
* 1. system_stm32f4xx.c 的 #define PLL_M 等於 8 (預設這是25,你延遲會慢3倍!!)
* (----------以下改了求心安,本程式實際測式似乎沒甚麼太大效果-----------)
* 2. stm32f4xx.h 的 #define HSE_VALUE 的 25000000 改為 8000000
* 3. stm32f4xx_conf.h 的 #define HSE_VALUE 的 8000000 不變
* 4. Kill-MDK 的 Project/Option for Target 的 Target 頁簽 Xtal (MHz) 改為 8.0
*/
#include "stm32f4xx.h"
static volatile int TimingDelay; // 防止編譯器優化,所以加上 volatile
/*
* 滴答中斷(Tick Interrupt),此涵式建議寫在:stm32f4xx_it.c 中
* 中斷次數=實體頻率/自訂值,自訂值由 SysTick_Config() 設定
*/
void SysTick_Handler(void)
{
// TimingDelay 由 Delay() 給值,只要不為 0 他將會一直遞減下去...
if (TimingDelay != 0)
{
TimingDelay--;
}
}
/*
* 延遲函數
*/
void Delay(int nTime)
{
// 將 nTime 傳給 TimingDelay,之後讓 TimingDelay 遞減
TimingDelay = nTime;
// 等待 SysTick_Handler() 中斷涵式
// 把 TimingDelay 減到 0 才跳出迴圈
// TimingDelay 非零將會一直空轉
while(TimingDelay != 0);
}
/*
* 初始化 LED
*/
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*
* 主程式
*/
int main()
{
LED_Init();// 初始化 LED
// 設定 滴答時鐘(IC的心跳),中斷次數=實體頻率/自訂值
// 如果系統頻率為 168MHz,而這裡我設定16800,則每秒會中斷 1000 次
if (SysTick_Config(168000)) // 168000 也可以用 SystemCoreClock / 1000 取代
{
while (1);// SysTick_Config() 的值設定太大,所以終止繼續運行 (人為疏失)
}
while(1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); // LED 點亮
Delay(1000); // 延遲一秒
GPIO_ResetBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); // LED 熄滅
Delay(1000); // 延遲一秒
}
}
全站熱搜