- 開啟時鐘,先查找到開啟時鐘的寄存器,然后通過該寄存器操作時鐘的開啟或關閉,要打開的是GPIOA的時鐘
- 在芯片手冊,找到RCC寄存器描述章節
- 找到APB2外設時鐘使能寄存器(RCC_APB2ENR),現在算RCC_APB2ENR這個寄存器的地址,先知道RCC這個外設的基地址,然后加上這個寄存器的偏移地址就行了
- RCC外設及地址在寄存器組起始地址表中查到,叫做復位和時鐘控制(RCC),我查到的是0x40021000---0x400213FF,所以RCC這個外設的基地址為0x40021000
- 在APB2外設時鐘使能寄存器(RCC_APB2ENR)下面可以看到偏移地址為0x18
- 所以RCC_APB2ENR的地址為0x40021000+0x18
- 有了地址就可以寫入了
- 向第二位寫入1,就是寫入4
- 最終就是? *(uint32_t *)(0x40021000 + 0x18) = 4;
- 給IO口設置輸出模式
- 需要先找到GPIOA的基地址,再根據偏移地址找到要使用的寄存器的地址
- GPIOA的基地址在寄存器組起始地址表中查到,我查到的是0x40010800---0x40010BFF
- 配置PA0口的輸出模式的寄存器是GPIOA_CRL,推挽輸出就是寫入4
- 最后是? ?*(uint32_t *)(0x40010800 + 0x00) = 3;
- 給指定PA0口輸出0就可以點亮LED1了
- 寄存器是ODR數據輸出寄存器
- ODR寄存器的地址是 0x40010800 + 0x0c 。給這個地址的第0位寫0,其他位寫1
- 最后是? ??*(uint32_t *)((0x40010800 + 0x0c)) = 0xfffe;
- ST公司已經定義好外設寄存器地址,我們直接食用菌就好
- 最后是
#include "stm32f10x.h"int main(void) {RCC->APB2ENR = 4;GPIOA->CRL = 3;GPIOA->ODR = 0xfffe;while (1){} } 或者是 #include "stm32f10x.h"int main(void) {/* 開啟GPIOA的時鐘 第2位置1*/RCC->APB2ENR |= 0x1 << 2;/* GPIOA_CRL的最后4位置 0011 */GPIOA->CRL &= ~(0x1 << 3);GPIOA->CRL &= ~(0x1 << 2);GPIOA->CRL |= 0x1 << 1;GPIOA->CRL |= 0x1 << 0;/* GPIOA_ODR的第0位置0 */GPIOA->ODR &= ~(0x1 << 0);while (1){} } 或者是 #include "stm32f10x.h"int main(void) {RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;GPIOA->CRL &= ~GPIO_CRL_CNF0_1;GPIOA->CRL &= ~GPIO_CRL_CNF0_0;GPIOA->CRL |= GPIO_CRL_MODE0_1;GPIOA->CRL |= GPIO_CRL_MODE0_0;GPIOA->ODR &= ~GPIO_ODR_ODR0;while (1){} }
- 最后是