百度文库 牛人的STM32学习笔记(寄存器版本) 帮忙下载一下 谢谢
发布网友
发布时间:2023-07-08 18:09
我来回答
共2个回答
热心网友
时间:2023-10-22 18:03
附件已上传 请下载 满意请采纳回答
热心网友
时间:2023-10-22 18:03
一、GPIO口的配置
STM32的DGPIO口最多可以有7组(GPIOa~GPIOg),而每一组GPIO口均有16个双向IO组成。并且没个IO口均可配置成8种模式(4种输入模式,4种输出模式)。不管配置哪个IO口也不论将其配置成哪种模式(但是配置成哪种模式要看具体应用,参考《中文参考手册》第105页)都可以按以下步骤来进行配置: (1)使能PORTx(x=A~G)时钟
这里就得操作寄存器RCC_APB2ENR(32为寄存器)了
RCC_APB2ENR的0~15位(06~32位保留)
第2~8分别是使能GPIOA~GPIOG时钟的,只要将其置“1”即可,如
RCC_APB2ENR|=1<<2;就是使能GPIOA的时钟;其余IO口的始终使能一次类推。 (2)对相应的IO模式进行配置,低8位配置GPIOx_CRL;高8位配置GPIOx_CRH
31 30 29 28 27 26 25 24 CNF7[1:0] MODE7[1:0] CNF6[1:0] MODE6[1:0] 23 22 21 20 19 18 17 16 CNF5[1:0] MODE5[1:0] CNF4[1:0] MODE4[1:0] 15 14 13 12 11 10 9 8 CNF3[1:0] MODE3[1:0] CNF2[1:0] MODE2[1:0] 7 6 5 4 3 2 1 0 CNF1[1:0] MODE1[1:0] CNF0[1:0] MODE0[1:0]
GPIOx_CRL(x=A~G(端口配置低寄存器x=A„E)
该寄存器用于配置GPIOx的低8位,具体8种模式的配置见《中文参考手册》例如: GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300;/PD.2推挽输出;其余IO口的低8位以此类推。
31 30
29 28 27 26 25 24 CNF15[1:0] MODE15[1:0] CNF14[1:0] MODE14[1:0] 23 22 21 20 19 18 17 16 CNF13[1:0] MODE13[1:0] CNF12[1:0] MODE12[1:0] 15 14 13 12 11 10 9 8 CNF11[1:0] MODE11[1:0] CNF10[1:0] MODE10[1:0] 7 6 5 4 3 2 1 0 CNF9[1:0] MODE9[1:0] CNF8[1:0] MODE8[1:0]
GPIOx_CRH(端口配置高寄存器x=A„E)
该寄存器用于配置GPIOx的高8位,具体8种模式的配置见《中文参考手册》例如: GPIOA->CRH&=0XFFFFFFF0;;GPIOA->CRH|=0X00000003;//PA8 推挽输出;其余IO口的高8位以此类推。
15 14 13 12 11 10 9 8 ADC3EN
USART1EN TIM8EN
SPI1EN
TIM1EN
ADC2EN
ADC1EN
IOPGEN
7 6 5 4 3 2 1 0 IOPFEN IOPEEN IOPDEN IOPCEN IOPBEN IOPAEN 保留 AFIOEN
(3)端口的输入和输出电平配置
15 14 13 12 11 10 9 8 IDR15
IDR14
IDR13
IDR12
IDR11
IDR10
IDR9
IDR8
7 6 5 4 3 2 1 0 IDR7 IDR6 IDR5 IDR4 IDR3 IDR2 IDR1 IDR0
GPIOx_IDR(端口输入数据寄存器x=A„E) 该寄存器配置IO口的0~15位的输入数据,以16位读出。
15 14 13 12 11 10 9 8 ODR15 ODR14 ODR13 ODR12 ODR11 ODR10 ODR9 ODR8 7 6 5 4 3 2 1 0 ODR7 ODR6 ODR5 ODR4 ODR3 ODR2 ODR1 ODR0
GPIOx_ODR(端口输出数据寄存器x=A„E)
该寄存器配置IO口的0~15位的输入初始状态,例如:GPIOA->ODR|=1<<13;//PA13上拉输入
一般GPIO口配置可仿以下两个程序: void KEY_Init(void) {
RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入 GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入 GPIOA->CRH|=0X80800000; GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉 GPIOA->ODR|=1<<15; //PA15上拉 }
void LED_Init(void) {
RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出 GPIOA->ODR|=1<<8; //PA8 输出高 GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;//PD.2推挽输出 GPIOD->ODR|=1<<2; //PD.2输出高 }
var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;
二、串口通信
STM32最多可以提供5路串口,其串口配置主要有以下步骤: (1)串口时钟使能
RCC_APB2ENR的0~15位(16~32位保留) 在寄存器RCC_APB2ENR里的第14位就是对串口1的时钟使能即: RCC_APB2ENR|=1<<14; //使能串口1时钟 , 那么除串口1的时钟使能在RCC_APB2ENR外其余的时钟使能位在寄存器RCC_APB1ENR里,看下表:
31
30
29 28 27 26 25 24 保留
DACEN
PWREN
BKPEN 保留 CANEN 保留
23 22 21 20 19 18 17 16 USBEN
I2C2EN
I2C1EN
UART5EN
UART4EN UART3EN UART2EN 保留
15 14 13
12 11 10 9 8 SPI3EN
SPI2EN
保留 WWDGEN 保留
7
6
5 4 3 2 1 0 保留
TIM7EN TIM6EN TIM5EN TIM4EN TIM3EN TIM2EN
RCC_APB1ENR
例如:RCC_APB1ENR|=1<<17; //使能串口2时钟 ,其余串口时钟使能以此类推。 (2)串口复位即结束复位
STM32在使用串口时不管当前该串口出于什么状态都先要将其复位,而复位后要将其结束复位。串口复位主要在寄存器RCC_APB1RSTR(串口1的复位)和寄存器 RCC_APB2RSTR(其余串口复位)这两个寄存器如下表
15
14 13
12
11
10
9
8
ADC3RST USART1RST TIM8RST SPI1RST TIM1RST ADC2RST ADC1RST IOPGRST 7
6 5
4
3
2
1 0
IOPFRST IOPERST IOPDRST IOPCRST IOPBRST IOPARST 保留 AFIORST
RCC_APB2RSTR(APB2外设复位寄存器)
寄存器RCC_APB2RSTR的第14位是进行串口1的复位如:RCC_APB1RSTR|=1<<14; //将串口1复位 ,然后结束复位RCC_APB1RSTR|=~(1<<14); //结束串口1复位 其余串口复位在寄存器 RCC_APB1RSTR里如下表:
15 14 13 12 11 10 9 8 ADC3EN
USART1EN TIM8EN
SPI1EN
TIM1EN
ADC2EN
ADC1EN
IOPGEN
7 6 5 4 3 2 1 0 IOPFEN IOPEEN IOPDEN IOPCEN IOPBEN IOPAEN 保留 AFIOEN
var cpro_psid = "u2787156";
var cpro_pswidth = "966";
var cpro_psheight = "120";
http://wenku.baidu.com/view/a58c835027284b73f24250d6.html