版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 一、GPIO口的配置 STM32的DGPIO口最多可以有7组(GPIOaGPIOg),而每一组GPIO口均有16个双向IO组成。并且没个IO口均可配置成8种模式(4种输入模式,4种输出模式)。不管配置哪个IO口也不论将其配置成哪种模式(但是配置成哪种模式要看具体应用,参考中文参考手册第105页)都可以按以下步骤来进行配置:(1) 使能PORTx(x=AG)时钟 这里就得操作寄存器RCC_APB2ENR(32为寄存器)了15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPD
2、ENIOPCENIOPBENIOPAEN保留AFIOEN RCC_APB2ENR的015位(0632位保留) 第28分别是使能GPIOAGPIOG时钟的,只要将其置“1”即可,如RCC_APB2ENR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X;/PD.2推挽输出;其余IO口的低8位以此类推。3130292827262524CNF151:0MODE151:0CNF141:0MODE141:02322212019181716CNF131:0MODE131:0CNF121:0MODE121:015141312111098CNF111:0MODE111:0CNF101:0MODE
3、101:076543210CNF91:0MODE91:0CNF81:0MODE81:0 GPIOx_CRH(端口配置高寄存器x=AE)该寄存器用于配置GPIOx的高8位,具体8种模式的配置见中文参考手册例如:GPIOA-CRH&=0XFFFFFFF0;;GPIOA-CRH|=0X;/PA8 推挽输出;其余IO口的高8位以此类推。(3) 端口的输入和输出电平配置15141312111098IDR15IDR14IDR13IDR12IDR11IDR10IDR9IDR876543210IDR7IDR6IDR5IDR4IDR3IDR2IDR1IDR0 GPIOx_IDR(端口输入数据寄存器x=AE)该寄
4、存器配置IO口的015位的输入数据,以16位读出。15141312111098ODR15ODR14ODR13ODR12ODR11ODR10ODR9ODR876543210ODR7ODR6ODR5ODR4ODR3ODR2ODR1ODR0 GPIOx_ODR(端口输出数据寄存器x=AE)该寄存器配置IO口的015位的输入初始状态,例如:GPIOA-ODR|=1APB2ENR|=1CRL&=0XFFFFFFF0;/PA0设置成输入 GPIOA-CRL|=0X; GPIOA-CRH&=0X0F0FFFFF;/PA13,15设置成输入 GPIOA-CRH|=0X; GPIOA-ODR|=1ODR|=1A
5、PB2ENR|=1APB2ENR|=1CRH&=0XFFFFFFF0; GPIOA-CRH|=0X;/PA8 推挽输出 GPIOA-ODR|=1CRL&=0XFFFFF0FF;GPIOD-CRL|=0X;/PD.2推挽输出GPIOD-ODR|=12; /PD.2输出高 二、串口通信STM32最多可以提供5路串口,其串口配置主要有以下步骤:(1) 串口时钟使能15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOEN RCC
6、_APB2ENR的015位(1632位保留)在寄存器RCC_APB2ENR里的第14位就是对串口1的时钟使能即:RCC_APB2ENR|=114; /使能串口1时钟 , 那么除串口1的时钟使能在RCC_APB2ENR外其余的时钟使能位在寄存器RCC_APB1ENR里,看下表:3130292827262524保留DACENPWRENBKPEN保留CANEN保留2322212019181716USBENI2C2ENI2C1ENUART5ENUART4ENUART3ENUART2EN保留15141312111098SPI3ENSPI2EN保留WWDGEN保留76543210保留TIM7ENTIM6E
7、NTIM5ENTIM4ENTIM3ENTIM2EN RCC_APB1ENR例如:RCC_APB1ENR|=117; /使能串口2时钟 ,其余串口时钟使能以此类推。(2) 串口复位即结束复位STM32在使用串口时不管当前该串口出于什么状态都先要将其复位,而复位后要将其结束复位。串口复位主要在寄存器RCC_APB1RSTR(串口1的复位)和寄存器RCC_APB2RSTR(其余串口复位)这两个寄存器如下表15141312111098ADC3RSTUSART1RSTTIM8RSTSPI1RSTTIM1RSTADC2RSTADC1RSTIOPGRST76543210IOPFRSTIOPERSTIOPDR
8、STIOPCRSTIOPBRSTIOPARST保留AFIORST RCC_APB2RSTR(APB2外设复位寄存器)寄存器RCC_APB2RSTR的第14位是进行串口1的复位如:RCC_APB1RSTR|=114; /将串口1复位 ,然后结束复位RCC_APB1RSTR|=(114); /结束串口1复位其余串口复位在寄存器 RCC_APB1RSTR里如下表:3130292827262524保留DACRSTPWRRSTBKPRST保留CANRST保留2322212019181716USBRSTI2C2RSTI2C1RSTUART5RSTUART4RSTUART3RSTUART2RST保留1514
9、1312111098SPI3RSTSPI2RST保留WWDGRST保留76543210保留TIM7RSTTIM6RSTTIM5RSTTIM4RSTTIM3RSTTIM2TST RCC_APB1RSTR(APB1外设复位寄存器)如: RCC_APB1RSTR|=117; /复位串口2 RCC_APB1RSTR|=(1CR1|=0X200C; /1位停止,无校验位. 0X200C=0010 0000 0000 1100B设置成使能串口8个字长1个停止位(USART_CR2中13:12默认为“0”)禁止校验,禁止校验所有中断,使能发送和接收。(5) 数据发送和接收15141312111098保留DR
10、876543210DR7:0 USART_DR(数据寄存器) 发送数据缓存寄存器(向它写数据它会自动发送数据),当接收到数据时则存放接收的数据(6) 串口控制15141312111098保留CTSLBD76543210TXETCRXNELDLEORENEFEPE USART_SR 参考程序: void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*)/(bound*16);/得到USARTDIVmantissa=temp; /得到整数部分fraction=(temp
11、-mantissa)*16; /得到小数部分 mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F; GPIOA-CRH|=0XB0;/IO状态设置 RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; / 波特率设置 USART1-CR1|=0X200C; /1位停止,无校验位. #ifdef EN_USART1_RX /如果使能了接收/使能接收中断USART1-CR1|=1CR1|=1SR&(1DR; if(USART_RX_STA&0x80)=0)/接收未完成if(USART_RX_STA&0x40)/接收到了0x0dif(r
12、es!=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;USART_RX_STA+;if(USART_RX_STA63)USART_RX_STA=0;/接收数据错误,重新开始接收 以上两个函数已经封装在usart.c中可直接调用 三、外部中断STM32的每一个IO口都可以作为中断输入,要想把IO口作为中断输入则必须将IO口设置成上拉/下拉输入或浮空输入(设置
13、成浮空输入时要接上拉或下拉电阻否则可能导致中断不断触发)。下面总结一下设置IO口为外部中断时的步骤:(1) 将IO口设置成输入模式这个在第一章总结过,这里不多说。(2)开启IO口复用时钟,设置IO口与中断线的映射关系这一步在函数void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 中已经封装好可直接调用这里说一下IO口的复用时钟使能:15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFI
14、OEN RCC_APB2ENR RCC_APB2ENR|=0X01; /使能IO口复用时钟(3)开启与该IO口相对应的线上中断/事件,并设置触发条件这一步封装在函数void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 中,可以直接调用,例如:Ex_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_PreemptionPrio
15、rity,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 里面可以直接调用,例如:MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); /抢占2,子优先级2,组2这里值得注意的是EXTI0、EXTI1、EXTI2、EXTI3、EXTI4为Line0Line4EXTI15_10为Line15Line10 EXTI9_5为Line9Line5 (5)编写中断服务函数例如: void EXTI15_10_IRQHandler(void) delay_ms(10); /消抖 if(KEY0=0) /按键0 LED0=!LED0
16、; else if(KEY1=0)/按键1 LED1=!LED1; EXTI-PR=1PR=1APB1ENR|=1APB1ENR|=1APB1ENR|=1APB1ENR|=0X01;/使能TIME2的时钟使能;(RCC-APB1ENR|=1DIER|=1DIER|=1CR1|=0x01; /使能定时器315141312111098保留CC4OFCC3OFCC2OFCC1OF保留76543210BIFTIFCOMIFCC4IFCC3IFCC2IFCC1IFUIF TIMx_SR该寄存器用来标记当前预定时器相关的各种事件/中断是否发生。UIF:更新中断标记,当产生更新事件时该位由硬件置1。例如:i
17、f(TIM3-SR&0X0001)/溢出中断(5) TIM3中断分组设置例如:MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/抢占1,子优先级3,组2直接调用该函数就行(6) 编写中断服务程序例如:void TIM3_IRQHandler(void) if(TIM3-SR&0X0001)/溢出中断 LED1=!LED1; TIM3-SR&=(1APB1ENR|=1ARR=arr; /设定计数器自动重装值/刚好1ms TIM3-PSC=psc; /预分频器7200,得到10Khz的计数时钟 /这两个东东要同时设置才可以使用中断 TIM3-DIER|=1DIER|=1CR
18、1|=0x01; /使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/抢占1,子优先级3,组2TIME2的CH2模式2的PWM输出:脉冲宽度调制模式可以产生一个由寄存器TIMx_ARR确定频率和由寄存器TIMx_CCRx确定其占空比的PWM波形;使能定时器:RCC-APB1ENR|=1CCMR1|=7CCMR1|=111; /使能预装载寄存器使能自动重装载的预装载寄存器:最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器;15141312111098保留CKD1:076543210ARPECMS1:0
19、DIR OPMURSUDISCEN TIMx_CR1 TIMx_CR1|=1CCER&=0X03; TIM2-CCMR|=1APB1ENR|=1ARR=arr;/设定计数器自动重装值 TIM3-PSC=psc;/预分频器不分频 TIM2-CCMR1|=7CCMR1|=1CR1|=1CR1|=1CCER=0X3303; TIM2-CCER|=1APB1ENR|=1CRL&=0X0FFFFFFF;/PA7输出GPIOA-CRL|=0XB;/复用功能输出 GPIOA-ODR|=1ARR=arr;/设定计数器自动重装值 TIM3-PSC=psc;/预分频器不分频TIM3-CCMR1|=7CCMR1|=1CCER|=1CR1=0x8000; /ARPE使能 TIM3-CR1|=0x01; /使能定时器3 其余几个定时器的PWM输出寄存器配置依次类推。以下子说明如何在TI1 输入的上升沿时捕获计数器的值到TIM1_CCR1寄存器中,步骤如下:1、 使能TIM1时钟:15141312111098ADC3ENUSART1ENTIM8ENSPI1ENTIM1ENADC2ENADC1ENIOPGEN76543210IOPFENIOPEENIOPDENIOPCENIOPBENIOPAEN保留AFIOEN RCC_APB2ENR的015位(0632位保留) RCC-APB2ENR|=1CCMR=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度不锈钢管件加工与销售合同
- 蒸汽机锅炉市场需求与消费特点分析
- 电子游戏装置市场发展预测和趋势分析
- 2024年度城市公共交通设施建设钢材购销合同
- 2024年度建筑设计合同(项目要求与设计费用计算)
- 2024年度大型科学仪器共享平台建设合同
- 蓄电池搬运车市场发展预测和趋势分析
- 电子读卡器市场发展现状调查及供需格局分析预测报告
- 2024年度物业管理保洁服务增值合同
- 2024年度毛石需求预测与供应合同
- 太阳能热水系统节能效果测试方案
- 1000字作文稿纸模板(完美版)
- 小产权拆迁安置回迁房买卖合同
- IPC4552中文.doc
- 《偷影子的人》PPT课件
- 电力系统三维可视化技术及应用
- 阳光照耀着塔什库尔干(二胡+钢琴伴奏) 钢琴伴奏谱 五线谱 伴奏谱 钢琴谱 谱 正谱
- 中粮班组建设通用管理标准细则
- 第二章制冷压缩机的选型及热力计算
- 中国美术史 第四章 三国两晋南北朝美术
- 医院施工现场应急预案救援预设方案
评论
0/150
提交评论