經過今天一天的努力終于完成了我的stm32第一個程序;我也是今天才開始接觸stm32。
由于苦于沒有資料,木有例程,找到的例程都是帶有庫的,這樣對stm32基礎的管腳配置就不容易懂了,主要是沒有一個具體的輪廓。
經過對庫文件的研究,和看了好幾節視頻,又根據自己以前搞430和arm9的經驗,就按著以前的思路進行研究,終于開發出自己的第一個LED程序;
1、創建工程
(1)Project ?--> ? New uvision Project?
(2)選擇工程要保存的地方
(3)選擇CPU
(4)選擇“是”(如果你使用從STM下載的庫的話,就選“否”)

(5)修改一下代碼(如果不注視掉紅色部分,會出現錯誤)
~~~
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
~~~
(6)加入定義
Flash ?--> Flash config tools --> ?C/C++ ?-->
在Defines里面添加:STM32F10X_HD
不然也會提示錯誤!
(7)Jlink下載設置(如果你用的是Jlink可以設置下)
在(6)的Flash config tools中的Debug中選中use [J-LINK / J-Trace Cortex ] -->Setting --> Flash Download 按照如下設置

這樣算是大致設置好了。
2、編寫時鐘初始化程序

~~~
int sys_init(unsigned char PLL)
{
unsigned char temp = 0;
RCC->CR |= 1<<16; //OPEN HSE
while(!(RCC->CR>>17));
RCC->CFGR = 0x04<<8; //APB1 HSE/2
PLL -= 2; //9-2 = 0111b
RCC->CFGR |= PLL << 18; //0111 ==> X9
RCC->CFGR |= 1 << 16; //PREDIV1 ouput as source of PLL
FLASH->ACR |= 0x32; //With
RCC->CR |= 1<<24; //enable PLL [24bit]
while(!(RCC->CR >> 25));
RCC->CFGR |= 0x2<<0;//PLL As System Clock
while(temp != 0x02)
{
temp = RCC->CFGR >> 2;
temp &= 0x03;
}
return 0;
}
~~~

具體數值為什么這么配置,請看寄存器
3、延時函數
為了實現準確延時,我們選用SysTick
~~~
void delay_ms(int timeout)
{
u32 temp = 0;
SysTick->CTRL = 0xfffffffb;
SysTick->LOAD = timeout*9000;
SysTick->VAL = 0x00;
SysTick->CTRL = 0x01;
do{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL = 0x00;
SysTick->VAL = 0x00;
}
~~~
這里的timeout不能超過一個值,具體多大可以自己計算下;
LOAD為24位 0xffffff/9000 = timeout_max;【注:感謝@大黃同學的幫我指出錯誤!!可以看下下面的寄存器】

STK_LOAD可用位數為[23:0];【再次感謝大黃!!!】
4、LED燈的控制
我的板子LED燈與stm32的pin是這樣對應的
LED1 ?--> ?PE1
LED2 ?--> ?PE0 ? ? ?
LED3 ?--> ?PE2 ? ? ??
LED4 ?--> ?PE3
我這里準備對LED2/PE0進行操作
~~~
int main()
{
sys_init(9); //系統時鐘初始化72M = 8M X 9
RCC->APB2ENR |= 1<<6; //使能GPIOE的時鐘
GPIOE->CRL &= 0xFFFFFFF0;//清除PE0的控制位
GPIOE->CRL |= 0x00000003; //選用輸出模式 --->50MHz
GPIOE->ODR |= 1<<0;//設置PE0位輸出模式
//GPIOE->BRR = 1<<0;//設置PE0輸出的電平
while(1){
delay_ms(1000);
GPIOE->BRR = 1<<0;//
delay_ms(1000);
GPIOE->BSRR = 1<<0;//
}
}
~~~
- 前言
- 【菜鳥入門】stm32的第一個程序--LED
- 【菜鳥入門】stm32 之 掃描按鍵
- 【菜鳥入門】stm32 之 中斷按鍵
- 【菜鳥入門】stm32 之 USART
- 【菜鳥入門】stm32 之 iic
- 【菜鳥入門】stm32 之 eeprom
- 【菜鳥入門】stm32 之 pwm
- 【菜鳥入門】stm32 之 ADC 模數轉換
- 【菜鳥入門】stm32 之 實時時鐘
- 【菜鳥入門】stm32 之 DMA
- 【菜鳥入門】stm32 之 DAC
- 【STM庫應用】stm32 之 USART
- 中斷源去抖辦法
- stm32 啟動代碼應用技巧
- 【STM庫應用】stm32 之 IIC應用
- 【STM庫應用】stm32 之 中斷按鍵初始化(注意事項)
- 關于結構體初始化
- 【STM庫應用】stm32 之 TIM (詳解一 通用定時器)
- 【STM庫應用】stm32 之 TIM (詳解二 脈沖寬度、周期測量)
- 【stm32庫應用】SD驅動移植(基于SDIO外設)
- SD卡fat文件系統移植
- stm32 DMA初始化選項研究
- stm32 靈活靜態存儲控制器(FSMC)(NORFLASH\PSRAM)
- 【stm32+uC/OS-II】ucosii移植簡單詳細步驟
- STM32 加入調試信息來調試代碼
- NRF24L01 無線通信模塊使用