目录
资料
寻址区
2区
TIMx
RTC
WWDG IWDG
SPI I2S
USART
I2C
USB全速设备寄存器
bxCAN
BKP
PWR
DAC
ADC
编辑
EXTI
编辑
GPIO AFIO
SDIO
DMA
CRC
RCC
FSMC
USB_OTG
ETH(以太网)
7区
配置流程
外部中断
硬件中断
例子
点灯
闪烁led
流水灯
键控led
资料
STM32F10x-中文参考手册
Cortex M3指南
stm32内核寄存器
寻址区
2区
TIMx
RTC
WWDG IWDG
SPI I2S
USART
I2C
USB全速设备寄存器
bxCAN
BKP
PWR
DAC
ADC
EXTI
GPIO AFIO
SDIO
DMA
CRC
RCC
FSMC
USB_OTG
待定
ETH(以太网)
7区
配置流程
外部中断
硬件中断
1.配置RCC_APB2ENR,使能GPIOx,AFIO
2.配置GPIOx_CRL/GPIOx_CRH,选择输入上拉或下拉模式和端口速度
3.配置EXTI_IMR,选择开放某条线上的中断请求
4.配置AFIO_EVCR,选择中断的触发引脚
5.配置AFIO_EXTICRx,根据中断引脚和EXTIx线进行配置
6.配置EXTI_RTSR/EXTI_FTSR,选择上升沿或下降沿触发
7.配置SCB_AIRCR,选择中断分组
8.配置PRI_x中断优先级寄存器阵列,根据中断号,中断分组和需要配置排队优先级与抢占优先级
9.配置SETENA寄存器族,根据中断号使能外部中断
10.读取 ACTIVE寄存器族,查看中断标志位
Cortex M3内核最多支持240个中断通道,但是STMF103C8T6/C6T6只设计了60个可屏蔽的中断通道。60个中断通道与它们在240个中断通道里的中断号是一样的。
用图表示必要流程:
例子
点灯
GPIO13低电平点亮led
#include<stdio.h>
int main(void){
//配置GPIOC时钟
*(unsigned *) 0x40021018 |= (1<<4);
//配置GPIOC为推挽模式输出
*(unsigned *) 0x40011004 &= ~(0xf<<20);
*(unsigned *) 0x40011004 |= (1<<21);
}
1.使能GPIOC RCC时钟(配置RCC_APB2ENR RCC_APB2使能寄存器)
2.配置GPIOC13为推挽输出模式(配置GPIOC_CRH GPIOC端口高位寄存器)
闪烁led
GPIO13低电平点亮led
#include<stdio.h>
int main(void){
int i;
*(unsigned *) 0x40021012 |= (1<<4);
*(unsigned *) 0x40011004 &= ~(0xF<<20);
*(unsigned *) 0x40011004 |= (1<<21);
while(1){
for(i=0;i<0xfffff;i++);
*(unsigned *) 0x4001100c = ~(*(unsigned *) 0x4001100c);
}
}
1.使能GPIOC RCC时钟(配置RCC_APB2ENR RCC_APB2使能寄存器)
2.配置GPIOC13为推挽输出模式(配置GPIOC_CRH GPIOC端口高位寄存器)
3.配置GPIOC13输出电平(配置GPIOC_ODR GPIOC端口输出数据寄存器)
完成配置步骤1、2,通过不断改变 GPIOC端口输出数据寄存器 的配置实现led的亮灭
流水灯
B3,B4,B5高电平点亮三个led
#include<stdio.h>
int main(void){
int i;
//配置GPIOB时钟
*(unsigned *) 0x40021018 |= (1<<3);
//初始化GPIOB3,GPIOB4,GPIOB5
*(unsigned *) 0x40010c00 &= ~(0xFFF000);
*(unsigned *) 0x40010c00 |= (0x222<<12);
while(1){
*(unsigned *) 0x40010c0c &= 0;
*(unsigned *) 0x40010c0c |= (1<<3);
for(i=0;i<0xfffff;i++);
*(unsigned *) 0x40010c0c &= 0;
*(unsigned *) 0x40010c0c |= (1<<4);
for(i=0;i<0xfffff;i++);
*(unsigned *) 0x40010c0c &= 0;
*(unsigned *) 0x40010c0c |= (1<<5);
for(i=0;i<0xfffff;i++);}
}
1.使能GPIOB RCC时钟(配置RCC_APB2ENR RCC_APB2使能寄存器)
2.配置B3,B4,B5为推挽输出模式(配置GPIOB_CRL GPIOB端口低位寄存器)
3.配置B3,B4,B5的输出电平(配置GPIOB_ODR GPIOB端口输出数据寄存器)
完成配置步骤1、2,通过延时,改变 GPIOB端口输出数据寄存器 的配置实现led的轮流亮灭
键控led
#include<stdio.h>
int main(void){
int i;
//配置GPIOB,GPIOC的时钟
*(unsigned *) 0x40021018 |= (3<<3);
//初始化GPIOC
*(unsigned *) 0x40011004 &= ~(0xf<<20);
*(unsigned *) 0x40011004 |= (1<<21);
//初始化GPIOB
*(unsigned *) 0x40010c00 &= ~(0xf<<12);
*(unsigned *) 0x40010c00 |= (8<<12);
while(1){
if((*(unsigned *) 0x40010c08 & (1<<3))==0){
for(i=0;i<1000;i++)
if((*(unsigned *) 0x40010c08 & (1<<3))==0){
*(unsigned *) 0x4001100c = ~(*(unsigned *) 0x4001100c);
}
}}
}
1.使能GPIOB,GPIOC RCC时钟(配置RCC_APB2ENR RCC_APB2使能寄存器)
2.配置GPIOC为推挽输出模式(配置GPIOC_CRH GPIOC端口高位寄存器)
3.配置PB3为上拉输入模式(配置GPIOB_CRL GPIOB端口低位寄存器)
4.配置GPIOC13输出电平(配置GPIOC_ODR GPIOC端口输出数据寄存器)
完成配置步骤1、2、3,通过判断GPIOB端口输出的是否为低电平,控制灯的亮灭