SysTick 定時器被集成在NVIC中。因此,只要是Cortex-M3 內核的單片機,就都有它。這個學習筆記就用SysTick 定時器來實現走馬燈的功能。
SysTick 定時器非常簡答,只有四個寄存器。這四個寄存器的含義在《Cortex-M3權威指南》那本書中講的非常的清楚,這里不復述了,下面只講講在STM32上SysTick有什么特殊之處。按照CMSIS 標準,用C語言訪問這四個寄存器時使用的寄存器名稱分別如下:
SysTick->CTRL
SysTick->LOAD
SysTick->VAL
SysTick->CALIB
SysTick->CALIB 的值固定為9000,因此,只有當系統嘀嗒時鐘設定為9MHz(HCLK/8的最大值) ,產生1ms 時間基準。
STM32提供了2個時鐘源:
0: AHB/8
1: Processor clock (AHB)
因此,SysTick->CTRL = 7 表示使用處理器時鐘作為時鐘源,使能SysTick,并且使能SysTick中斷。SysTick->CTRL = 3 時頻率降為原來的1/8。
我的開發板上有四個LED,分別對應的GPIO端口D 的 PD2、PD3、PD4和PD7。
下面是例子程序,仍然先是直接設置寄存器。
#include "stm32f10x.h"
#define RCC_GPIO_LED RCC_APB2Periph_GPIOD
#define GPIO_LED_PORT GPIOD
#define GPIO_LED1 GPIO_Pin_2
#define GPIO_LED2 GPIO_Pin_3
#define GPIO_LED3 GPIO_Pin_4
#define GPIO_LED4 GPIO_Pin_7
#define GPIO_LED_ALL GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
void LED_Spark(void)
{
static int state = 0;
switch (state)
{
case 0:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);
state ++;
break;
case 1:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);
state ++;
break;
case 2:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);
state ++;
break;
case 3:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);
state = 0;
break;
default:
state = 0;
break;
}
}
int main(void)
{
SystemInit();
RCC->APB2ENR |= 0x00000020;
GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode
SysTick->LOAD = 24000000/200;
SysTick->CTRL = 3;
for(;;)
{
}
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
static int count = 0;
count ++;
if (count == 100)
{
LED_Spark();
count = 0;
}
}
然后是利用STM32 固件函數庫提供的函數的例子。
[cpp] view plain copy
#include "stm32f10x.h"
#define RCC_GPIO_LED RCC_APB2Periph_GPIOD
#define GPIO_LED_PORT GPIOD
#define GPIO_LED1 GPIO_Pin_2
#define GPIO_LED2 GPIO_Pin_3
#define GPIO_LED3 GPIO_Pin_4
#define GPIO_LED4 GPIO_Pin_7
#define GPIO_LED_ALL GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
void LED_Spark(void)
{
static int state = 0;
switch (state)
{
case 0:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);
state ++;
break;
case 1:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);
state ++;
break;
case 2:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);
state ++;
break;
case 3:
GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);
state = 0;
break;
default:
state = 0;
break;
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SystemInit();
SysTick_Config(SystemCoreClock/100);
/* Enable GPIOB, GPIOC and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); //RCC_APB2Periph_AFIO
/* LEDs pins configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
for(;;)
{
}
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
static int count = 0;
count ++;
if (count == 100)
{
LED_Spark();
count = 0;
}
}
需要說明的是,若是用 SysTick_Config 函數來設置SysTick的中斷頻率,時鐘源就不能人為的指定了,這時使用的時鐘源就是內核的頻率。
SystemCoreClock 是個全局變量,它的值就是內核的運行頻率,不過前提要調用 SystemInit() 函數來設置內核的頻率。如果內核的頻率是字節寫寄存器來設置的,SystemCoreClock 的值就不一定對了。
上一篇:STM32F10x 學習筆記之解決JLink 無法下載程序的問題
下一篇:最后一頁
推薦閱讀
史海拾趣
近年來,Eclipse Magnetics公司在電火花加工領域取得了顯著的成就。他們推出的Micromag磁過濾器產品在電火花加工過程中實現了巨大的成本節約。通過與ADM精密工具和Sodi-tech EDM有限公司的合作,Eclipse Magnetics成功提高了Sodick AQ600L線蝕機的效率,減少了停機時間,為客戶帶來了顯著的經濟效益。
在1950年代,Eclipse Magnetics公司決定將他們的磁鐵涂上紅色,并與馬蹄形標志和公司顏色相匹配。這個簡單的改變在當時看似微不足道,但卻成為了一個重要的轉折點。紅色磁鐵不僅提升了產品的視覺吸引力,還增強了品牌識別度。隨著紅色磁鐵的廣泛應用,Eclipse Magnetics開始逐漸在電子行業中嶄露頭角。
在短短幾年內,聚洵半導體實現了業績的快速增長。據公司董事長兼總經理張智才介紹,在2020年這一特殊年份,聚洵依然實現了業績增長500%的佳績,累計出貨量超過2億顆,成交客戶數量達500多家。這一成績不僅彰顯了聚洵在產品研發和市場銷售方面的實力,也贏得了業界的廣泛認可。公司的典型終端客戶包括美的、格蘭仕、小米等知名品牌,進一步證明了聚洵產品在市場上的競爭力和影響力。
E-Switch公司始終堅持以客戶為中心的經營理念,致力于為客戶提供優質的服務和產品。公司建立了完善的客戶服務體系,及時解決客戶在使用過程中遇到的問題。同時,E-Switch還積極與客戶保持溝通交流,了解市場需求變化,以便及時調整產品策略和生產計劃。正是這種以客戶至上的經營理念和持續發展的戰略眼光,讓E-Switch在電子行業中不斷發展壯大。
在電子行業中,技術創新是企業保持競爭力的關鍵。E-Switch公司深知這一點,因此不斷投入研發力量,尋求技術突破。近年來,公司在開關產品的智能化、小型化、高可靠性等方面取得了顯著成果,多項技術處于行業領先地位。這些技術突破不僅提升了產品的性能,也進一步鞏固了E-Switch在電子行業中的領先地位。
自1979年成立以來,E-Switch公司始終將創新作為發展的核心動力。在公司成立初期,面對激烈的市場競爭,E-Switch決定走差異化路線,專注于開發和生產高品質的開關產品。通過不斷的技術創新和產品優化,E-Switch逐漸在電子行業中樹立了自己的品牌形象。
功率變換技術是按用戶需求改變電能應用方式(改變電能的波形、頻率等)的技術;可以有AC/DC、DC/DC、DC/AC、AC/AC及其相互組合的多種變換。40年代前后,由電磁元件組合形成的各種功率變換過程基本上可實現清潔電源。例如,將交流電動機與直流發 ...… 查看全部問答∨ |
|
工信部首次明確3G牌照歸屬 年底或明年初發照 http://tech.163.com/08/1212/11/4SV7EQOV000915BE.html 工業和信息化部部長李毅中今日稱,根據綜合考慮,我們將通過一定的程序在年底或明年年初發放3G牌照 ...… 查看全部問答∨ |
|
我講外部RAM存儲數據,內部RAM放堆棧,程序很簡單,就是將外部ram復制,同時讀取,讀取后用串口發出來,我用JLINK調試,程序始終停在串口等待處,查看賦值也不對。我手動復位板子,不用JLINK帶,STM32能夠對外部RAM賦值,并且能夠從串口輸出來 ...… 查看全部問答∨ |