牛人的STM32学习笔记(寄存器版本)_第1页
牛人的STM32学习笔记(寄存器版本)_第2页
牛人的STM32学习笔记(寄存器版本)_第3页
牛人的STM32学习笔记(寄存器版本)_第4页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 GPIO 口的配置STM32 的 DGPIO 口最多可以有 7 组( GPIOaGPIOg ),而每一组 GPIO 口均有16 个双向 IO 组成。并且没个 IO 口均可配置成 8 种模式( 4 种输入模式, 4 种输出模式) 。不管配置哪个 IO 口也不论将其配置成哪种模式(但是配置成哪种模式要看具体应用,参考中文参考手册第105 页)都可以按以下步骤来进行配置:( 1)使能 PORTx (x=AG )时钟这里就得操作寄存器RCC_APB2ENR ( 32 为寄存器)了15ADC3EN7IOPFEN1413USART1ENTIM8EN65IOPEENIOPDEN12SPI1EN4IOP

2、CEN11TIM1EN3IOPBEN10ADC2EN2IOPAEN9ADC1EN1保留8IOPGEN0AFIOENRCC_APB2ENR的 015 位( 0632 位保留)第 28 分别是使能GPIOAGPIOG时钟的,只要将其置“1”即可,如RCC_APB2ENR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X00000300;/PD.2推挽输出;其余IO口的低 8 位以此类推。3130292827262524CNF151:0MODE151:0CNF141:0MODE141:02322212019181716CNF131:0MODE131:0CNF121:0MODE121:0

3、15141312111098CNF111:0MODE111:0CNF101:0MODE101:076543210CNF91:0MODE91:0CNF81:0MODE81:0该寄存器用于配置GPIOxGPIOx_CRH( 的高 8 位,具体端口配置高寄存器x=AE)8 种模式的配置见中文参考手册例如:GPIOA-CRH&=0XFFFFFFF0;; GPIOA-CRH|=0X00000003; /PA8推挽输出;其余IO口的高8 位以此类推。(3)端口的输入和输出电平配置15141312111098IDR15IDR14IDR13IDR12IDR11IDR10IDR9IDR876543210IDR7

4、IDR6IDR5IDR4IDR3IDR2IDR1IDR0GPIOx_IDR (端口输入数据寄存器x=A E)该寄存器配置 IO 口的 015 位的输入数据,以16 位读出。15141312111098ODR15ODR14ODR13ODR12ODR11ODR10ODR9ODR876543210ODR7ODR6ODR5ODR4ODR3ODR2ODR1ODR0GPIOx_ODR (端口输出数据寄存器x=AE)该寄存器配置IO 口的 015 位的输入初始状态,例如: GPIOA-ODR|=1APB2ENR|=1CRL&=0XFFFFFFF0;/PA0设置成输入GPIOA-CRL|=0X00000008

5、;GPIOA-CRH&=0X0F0FFFFF;/PA13,15 设置成输入GPIOA-CRH|=0X80800000;GPIOA-ODR|=1ODR|=1APB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0;GPIOA-CRH|=0X00000003;/PA8推挽输出GPIOA-ODR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X00000300;/PD.2推挽输出GPIOD-ODR|=12;/PD.2 输出高二、串口通信STM32 最多可以提供5 路串口,其串口配置主要有以下步骤:(1)串口时钟使能15141312111098ADC3ENUSART1ENT

6、IM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOENRCC_APB2ENR的 015 位( 1632 位保留)在寄存器 RCC_APB2ENR里的第 14 位就是对串口 1 的时钟使能即:RCC_APB2ENR|=114;/使能串口 1 时钟 ,那么除串口1 的时钟使能在 RCC_APB2ENR外其余的时钟使能位在寄存器RCC_APB1ENR里,看下表:3130292827262524保留DACENPWRENBKPEN保留CANEN保留2322212019181716USB

7、ENI2C2ENI2C1ENUART5EN UART4EN UART3EN UART2EN 保留15141312111098SPI3ENSPI2EN保留WWDGEN保留76543210保留TIM7ENTIM6ENTIM5ENTIM4ENTIM3ENTIM2ENRCC_APB1ENR例如: RCC_APB1ENR|=117; / 使能串口2 时钟 ,其余串口时钟使能以此类推。(2)串口复位即结束复位STM32 在使用串口时不管当前该串口出于什么状态都先要将其复位,而复位后要将其结束复位。串口复位主要在寄存器RCC_APB1RSTR (串口 1 的复位)和寄存器RCC_APB2RSTR(其余串口复

8、位)这两个寄存器如下表15141312111098 ADC3RST USART1RSTIM8RST SPI1RST TIM1RST ADC2RST ADC1RST IOPGRST 76543210 IOPFRST IOPERST IOPDRST IOPCRST IOPBRST IOPARST 保留 AFIORSTRCC_APB2RSTR( APB2外设复位寄存器)寄存器 RCC_APB2RSTR 的第 14 位是进行串口1 的复位如: RCC_APB1RSTR|=114; /串口 1 复位,然后结束复位RCC_APB1RSTR|= ( 114 ); /结束串口1 复位其余串口复位在寄存器RCC

9、_APB1RSTR 里如下表:将3130292827262524保留DACRSTPWRRST BKPRST保留CANRST保留2322212019181716USBRSTI2C2RSTI2C1RST UART5RSTUART4RSTUART3RSTUART2RST保留15141312111098SPI3RSTSPI2RST保留WWDGRST保留76543210保留TIM7RSTTIM6RST TIM5RSTTIM4RSTTIM3RSTTIM2TSTRCC_APB1RSTR( APB1 外设复位寄存器)如: RCC_APB1RSTR|=117; / 复位串口2RCC_APB1RSTR|=(1CR

10、1|=0X200C;/1 位停止 ,无校验位设置成使能串口8 个字长 1 个停止位( USART_CR2校验所有中断,使能发送和接收。(5)数据发送和接收. 0X200C=0010 0000 0000 1100B中 13:12 默认为“ 0”)禁止校验,禁留4113102918DR80DR7:0USART_DR( 数据寄存器 )发送数据缓存寄存器(向它写数据它会自动发送数据),当接收到数据时则存放接收的数据(6)串口控制15141312111098保留CTSLBD76543210TXETCRXNELDLEORENEFEPEUSART_SR参考程序:void uart_

11、init(u32 pclk2,u32 bound)float temp;u16 mantissa;u16 fraction;temp=(float)(pclk2*1000000)/(bound*16);/得到 USARTDIVmantissa=temp;/得到整数部分fraction=(temp-mantissa)*16; / 得到小数部分mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F;GPIOA-CRH|=0X000008B0;/IO状态设置RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; /波特率设置USART1-CR

12、1|=0X200C;/1 位停止,无校验位.#ifdef EN_USART1_RX/ 如果使能了接收/使能接收中断USART1-CR1|=1CR1|=1SR&(1DR;if(USART_RX_STA&0x80)=0)/接收未完成if(USART_RX_STA&0x40)/接收到了0x0dif(res!=0x0a)USART_RX_STA=0;/接收错误 ,重新开始else USART_RX_STA|=0x80;/接收完成了else / 还没收到 0X0Dif(res=0x0d)USART_RX_STA|=0x40;elseUSART_RX_BUFUSART_RX_STA&0X3F=res;US

13、ART_RX_STA+;if(USART_RX_STA63)USART_RX_STA=0;/接收数据错误 ,重新开始接收以上两个函数已经封装在usart.c 中可直接调用三、外部中断STM32 的每一个IO 口都可以作为中断输入,要想把 IO 口作为中断输入则必须将IO设置成上拉 /下拉输入或浮空输入(设置成浮空输入时要接上拉或下拉电阻否则可能导致中断不断触发) 。下面总结一下设置IO 口为外部中断时的步骤:( 1)将 IO 口设置成输入模式这个在第一章总结过,这里不多说。( 2)开启 IO 口复用时钟,设置IO 口与中断线的映射关系这一步在函数void Ex_NVIC_Config(u8 G

14、PIOx,u8 BITx,u8 TRIM)中已经封装好可直接调用这里说一下IO 口的复用时钟使能:口15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOENRCC_APB2ENRRCC_APB2ENR|=0X01;/ 使能 IO 口复用时钟( 3)开启与该IO 口相对应的线上中断/事件,并设置触发条件这一步封装在函数void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)用,例如: Ex

15、_NVIC_Config(GPIO_A,0,RTIR); /设置 PA( 0)上升沿触发Ex_NVIC_Config(GPIO_A,13,FTIR);/设置 PA( 13)下降沿触发中,可以直接调( 4)配置中断分组(NVIC )并使能中断这一步封装在函数void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8NVIC_Channel,u8 NVIC_Group)里面可以直接调用,例如:MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);/ 抢占 2,子优先级2,组 2这里值得注意的是EXTI0

16、 、 EXTI1 、 EXTI2 、 EXTI3 、 EXTI4 为 Line0Line4EXTI15_10为Line15Line10EXTI9_5为Line9Line5(5)编写中断服务函数例如:void EXTI15_10_IRQHandler(void)delay_ms(10);if(KEY0=0)/消抖/按键0LED0=!LED0;else if(KEY1=0)/按键1LED1=!LED1;EXTI-PR=1PR=1APB1ENR|=1APB1ENR|=1APB1ENR|=1APB1ENR|=0X01 ;/ 使能 TIME2 的时钟使能;( RCC-APB1ENR|=1DIER|=1D

17、IER|=1CR1|=0x01;/ 使能定时器 315141312111098保留CC4OFCC3OFCC2OFCC1OF保留76543210BIFTIFCOMIFCC4IFCC3IFCC2IFCC1IFUIFTIMx_SR该寄存器用来标记当前预定时器相关的各种事件/中断是否发生。UIF :更新中断标记,当产生更新事件时该位由硬件置例如: if(TIM3-SR&0X0001)/溢出中断(5) TIM3 中断分组设置例如: MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/抢占直接调用该函数就行(6)编写中断服务程序例如: void TIM3_IRQHandler(voi

18、d)1。1,子优先级3,组2if(TIM3-SR&0X0001)/溢出中断LED1=!LED1;TIM3-SR&=(1APB1ENR|=1ARR=arr;/ 设定计数器自动重装值/刚好1msTIM3-PSC=psc;/预分频器 7200,得到 10Khz 的计数时钟/这两个东东要同时设置才可以使用中断TIM3-DIER|=1DIER|=1CR1|=0x01;/ 使能定时器 3MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/ 抢占 1,子优先级3,组 2TIME2的CH2模式2 的PWM输出:脉冲宽度调制模式可以产生一个由寄存器TIMx_ARR确定频率和由寄存器TIMx

19、_CCRx确定其占空比的PWM 波形;使能定时器: RCC-APB1ENR|=1CCMR1|=7CCMR1|=111;/ 使能预装载寄存器使能自动重装载的预装载寄存器:最后还要设置TIMx_CR1寄存器的ARPE位, (在向上计数或中心对称模式中)使能自动重装载的预装载寄存器;15141312111098保留CKD1:076543210ARPECMS1:0DIROPMURSUDISCENTIMx_CR1TIMx_CR1|=1CCER&=0X03;TIM2-CCMR|=1APB1ENR|=1ARR=arr;/设定计数器自动重装值TIM3-PSC=psc;/ 预分频器不分频TIM2-CCMR1|=

20、7CCMR1|=1CR1|=1CR1|=1CCER=0X3303;TIM2-CCER|=1APB1ENR|=1CRL&=0X0FFFFFFF;/PA7输出GPIOA-CRL|=0XB0000000;/复用功能输出GPIOA-ODR|=1ARR=arr;/设定计数器自动重装值TIM3-PSC=psc;/ 预分频器不分频TIM3-CCMR1|=7CCMR1|=1CCER|=1CR1=0x8000;/ARPE 使能TIM3-CR1|=0x01;/ 使能定时器3其余几个定时器的PWM 输出寄存器配置依次类推。以下 例子说明如何在TI1输入的上升沿时捕获计数器的值到TIM1_CCR1寄存器中,步骤如下:

21、1、使能 TIM1 时钟:15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOENRCC_APB2ENR的 015RCC-APB2ENR|=1CCMR =0X01;/CC1 通道选择输入,IC1映射在TI1上3、根据输入信号的特点,配置输入滤波器为所需的带宽(输入为TI1 时 TIM1_CCMRx寄存器中的ICxF 位)。假设输入信号在最多5 个时钟周期的时间内抖动,我们.配置滤波器的带长于 5 个时钟周期。因此我们可以(以f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论