先看頭文件
#ifndef __GPIO_LED72MHZ__
#define __GPIO_LED72MHZ__
#define GPIOB_BASE 0x40010c00
#define GPIOB_CRH (GPIOB_BASE + 0x04)
#define GPIOB_ODR (GPIOB_BASE + 0x0c)
#define rGPIOB_CRH (*(unsigned int *)GPIOB_CRH)
#define rGPIOB_ODR (*(unsigned int *)GPIOB_ODR)
#define RCC_BASE 0x40021000
#define RCC_APB2ENR (RCC_BASE + 0x18)
#define rRCC_APB2ENR (*(unsigned int *)RCC_APB2ENR)
void ledInit(void);
void ledFlash(void);
void delay(unsigned int i);
#endif
這個就很標準的寫法。
這些地址的值查stm32中文手冊即可
這個就是初始地址。
偏移量就是在剛纔上邊的基地址上加偏移量就是現在的地址。4個字節一般是。因爲32位除以8等於4,就是4個字節。每次傳輸數據都是4字節。具體寄存器是多少手冊裏找到對應的位寫就行。
手冊裏第六章是rcc寄存器,第八章是gpio,一眼就能找到。
#include "GPIO_LED72MHZ.h"
int main(void)
{
ledInit();
while(1)
{
ledFlash();
}
return 0;
}
void ledInit(void)
{
rRCC_APB2ENR = 0x00000008;
rGPIOB_CRH = 0x33333333;
rGPIOB_ODR = 0x0000ff00;
}
void ledFlash(void)
{
unsigned char i,j;
for(i = 0; i < 4; i ++)
{
rGPIOB_ODR = 0x0000ff00;
for(j = 0; j < 50; j++)
delay(50000);
rGPIOB_ODR = 0x0000f000;
for(j = 0; j < 50; j++)
delay(50000);
}
}
void delay(unsigned int i)
{
while(i --);
}
思路是這樣的。
STM32使用的時候先設置時鐘。在下一章裏會詳細設置。這裏直接就用系統默認的就行。rRCC_APB2ENR 是給APB2總線上的gpiob口使能,讓他上邊的時鐘工作起來。不設置的話就不動彈。時鐘是他的靈魂。
rGPIOB_ODR 這個是輸出口,設置1輸出1,設置0輸出0。因爲這32輸入和輸出是不同的寄存器。
rGPIOB_CRH 就是端口配置寄存器
是用來設置輸入輸出方式的。
兩個控制寄存器配置結束,就可以用了
輸出寄存器odr設置多少就輸出多少
就沒啦。
下一期講設置時鐘。有問題留言就行。