




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 .wd. .wd. .wd.接触了STM32的开发板快一周了,拿到板子厂商提供了些DEMO程序,其他想自己学习,看了ST的资料手册,感觉看下来,一个工具还是不知道若何用,还好现在网络强大,在论坛上可以去找自己需要的资料.我把搜集的资料整理了一下,以及自己加了一些自己的,方便自己以后再用到,方便查找,同时和网友们一起分享,希望你们有什么新的想法也提出来,一起分享.开场吧!嘿嘿简述1STM32的输入输出管脚有下面8种可能的配置:4输入+2输出+2复用输出 浮空输入_IN_FLOATING 带上拉输入_IPU 带下拉输入_IPD(所谓上拉就是接一电阻到电源;下拉就是接一电阻到地。也就是说带上拉就是
2、口初始的时候是高电平,下拉就是低电平。) 模拟输入_AIN 开漏输出_OUT_OD 推挽输出_OUT_PP 复用功能的推挽输出_AF_PP 复用功能的开漏输出_AF_OD1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关芯片内部在I/O口的输出局部安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择适宜的驱动电路。通过选择速度来选择不同的输出驱动模块,到达最正确的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非
3、常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配推荐10倍以上。比方:1.1.1 对于串口,假设最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。1.1.2 对于I2C接口,假设使用400k波特率,假设想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。1.1.3 对于SPI接口,假设使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。输入模式。1.4 所有端口都有外部中
4、断能力。为了使用外部中断线,端口必须配置成输入模式。1.5 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。2 在STM32中若何配置片内外设使用的IO端口首先,一个外设经过 配置输入的时钟和 初始化后即被激活(开启);如果使用该外设的输入输出管脚,那么需要配置相应的GPIO端口否那么该外设对应的输入输出管脚可以做普通GPIO管脚使用;再对外设进展详细配置。对应到外设的输入输出功能有下述三种情况:一、外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。二、外设对应的管脚为输入:那么根据外围电
5、路的配置可以选择浮空输入、带上拉输入或带下拉输入。三、ADC对应的管脚:配置管脚为模拟输入。 如果把端口配置成复用输出功能,那么引脚和输出存放器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。 3 通用IO端口GPIO初始化:3.1 GPIO初始化3.1.1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线外设时钟3.1.2 RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE)
6、:释放GPIO复位3.2 配置各个PIN端口模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD3.3 GPIO初始化完成=最近刚开场学习STM32,所以从最 基本的GPIO开场学起;首先看看STM32的datasheet上对GPIO口的简单介绍:每个GPI/O 端口有两个32 位配置存放器(GPIOx_CRL,GPIOx_CRH),两个32位数据存放器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位存放器(GPIOx_BSRR),一个16
7、 位复位存放器(GPIOx_BRR)和一个32 位锁定存放器(GPIOx_LCKR)。 GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口存放器必须按32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 存放器允许对任何GPIO 存放器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ 时不会发生不安全。端口位配置 CNFx1:0=xxb,MODEx1:0=xxb再看GPIO功能很强大:1.通用I/O(GPIO):最最 基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;2.单独的位设置或位去除
8、:方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平;3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式:(CNFx1:0=01b,MODEx1:0=00b)。5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O 功能的数量到达最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的存放器来完成。这时,复用功能就不再映射到它们的原始
9、引脚上了;6.GPIO锁定机制:当在一个端口位上执行了所定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。GPIO 基本设置GPIOMode_TypeDef GPIO mode 定义及偏移地址GPIO_Mode_AIN = 0 x0, /模拟输入GPIO_Mode_IN_FLOATING = 0 x04, /悬空输入GPIO_Mode_IPD = 0 x28, /下拉输入GPIO_Mode_IPU = 0 x48, /上拉输入GPIO_Mode_Out_OD = 0 x14, /开漏输出GPIO_Mode_Out_PP = 0 x10, /推挽输出GPIO_Mode_AF_OD
10、= 0 x1C, /开漏复用GPIO_Mode_AF_PP = 0 x18 /推挽复用GPIO输入输出速度选择:typedef enum GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz, GPIO_Speed_50MHzGPIOSpeed_TypeDef;#define IS_GPIO_SPEED(SPEED) (SPEED = GPIO_Speed_10MHz) | (SPEED = GPIO_Speed_2MHz) | (SPEED = GPIO_Speed_50MHz)做一个GPIO输出的试验当I/O 端口被配置为推挽模式输出时:输出存放器上的0 激活N-MOS
11、,而输出存放器上的1 将激活P-MOS。用这段程序实现:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;int main(void)#ifdef DEBUGdebug();#endif/* 设置系统时钟 */RCC_Configuration();/* 嵌套中断设置*/NVIC_Configuration();/* 激活GPIOC clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* Configure PC.04, PC.05, PC.06 and PC.07 as Ou
12、tput push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);while (1) /*本试验仅能实现LED1亮、熄功能*/ GPIO_SetBits(GPIOC, GPIO_Pin_4); /设置P
13、C.04 pin为高电平,点亮LED1 Delay(); GPIO_ResetBits(GPIOC, GPIO_Pin_4); /设置PC.04 pin为低电平,熄灭LED1 Delay();再来一个网上的DEMO:硬件电路本章实验硬件电路如图11-1所示,LED0和LED1分别通过一个1K限流电阻连接在STM32的GPIOA.2和GPIO.3上,另一端接GND注意是GND。实验设计本章的实验主要为了学习若何对STM32的GPIO口进展操作。根据图11-1所示硬件资源,我们可以做一个很简单的实验设计:将这两个LED点亮,隔一段时间后熄灭。程序设计该实验非常的简单,实现过程如下配置RCC存放器组
14、,使用PLL输出72MHz时钟;配置GPIOA.2和GPIOA.3为推挽输出,最大翻转频率为50MHz;点亮与熄灭LED;程序组里面一共包含以下文件:boot文件组:cortexm3_macro.s和stm32f10 x_vector.s文件;library文件组:stm32f10 x_rcc.c、stm32f10 x_flash.c、stm32_gpio.c、stm32f10 x_lib.c文件;interrupt文件组:stm32f10 x_it.c文件;src文件组:main.c文件;其中boot文件组放置的是STM32的启动文件,读者暂时不必深究,引用即可;Library文件组中,st
15、m32f10 x_rcc.c、stm32f10 x_flash.c包含着配置RCC的底层函数,stm32_gpio.c包含配置GPIO的底层函数;stm32f10 x_lib.c那么负责对整个库进展集中管辖,在任何一个基于固件库函数的STM32应用函数里,stm32f10 x_lib.c都是不可或缺的;interrupt文件组的stm32f10 x_it.c包含STM32的中断服务子程序,虽本实验尚未启用中断,但为了保持工程的完整性还是将其添加进来。程序流程图如下:程序启动之后,我们应该看到如下现象:LED0和LED1被点亮,但在隔一小段时间后熄灭。程序清单如下:/* 文件名 : main.c
16、* 作者 : Losingamong* 时间 : 08/08/2008* 文件描述 : 主函数*/* 头文件 -*/#include stm32f10 x_lib.h/* 自定义同义关键字 -*/* 自定义参数宏 -*/#define Delay(n)while(n)-)/* 自定义函数宏 -*/* 自定义变量 -*/* 自定义函数声明 -*/void RCC_Configuration(void);void GPIO_Configuration(void);/* 函数名 : main* 函数描述 : Main 函数* 输入参数 : 无* 输出结果 : 无* 返回值 : 无*/int main
17、(void)vu32 n = 2000000;/定义延时参数 /* 设置系统时钟 */ RCC_Configuration(); /* 设置GPIO端口 */ GPIO_Configuration(); /* PA.2 , PA.3输出高电平 */GPIO_SetBits(GPIOA , GPIO_Pin_2); GPIO_SetBits(GPIOA , GPIO_Pin_3); Delay(n); /* PA.2 , PA.3输出低电平 */GPIO_ResetBits(GPIOA , GPIO_Pin_2); GPIO_ResetBits(GPIOA , GPIO_Pin_3);while
18、(1);/* 函数名: RCC_Configuration* 函数描述 : 设置系统各局部时钟* 输入参数 : 无* 输出结果 : 无* 返回值 : 无*/void RCC_Configuration(void)/* 定义枚举类型变量 HSEStartUpStatus */ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置 */ RCC_DeInit(); /* 开启HSE */ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp();/* 判断
19、HSE起是否振成功,是那么进入if()内部 */ if(HSEStartUpStatus = SUCCESS) /* 选择HCLKAHB时钟源为SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择PCLK2时钟源为 HCLKAHB 1分频 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK1时钟源为 HCLKAHB 2分频 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置FLASH延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /
20、* 使能FLASH预取缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环PLL时钟源为HSE 1分频,倍频数为9,那么PLL输出频率为 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET); /* 选择SYSCLK时钟源为PL
21、L */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成为SYSCLK时钟源 */ while(RCC_GetSYSCLKSource() != 0 x08); /* 翻开APB2总线上的GPIOA时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);/* 函数名 : GPIO_Configuration* 函数描述 : 设置各GPIO端口功能* 输入参数 : 无* 输出结果 : 无* 返回值 : 无*/void GPIO_Configuration(void) GPIO
22、_InitTypeDef GPIO_InitStructure; /* 设置PA.2,PA.3为推挽输出,最大翻转频率为50MHz */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA , &GPIO_InitStructure); 本卷须知:配置RCC之前,建议先调用RCC_DeInit()函数复位RCC
23、设置,否那么可能会在调试过程中遇到不易预期到的初始化问题;APB1总线最大速率是36MHz,请读者注意RCC_PCLK1Config()的参数;FLASH延时周期数在本书xxx页有详细说明;GPIO配置为输出方向时,其最大翻转频率的设置语句是不可缺少的;有兴趣且未曾了解过带参数宏的读者可以研究一下本程序中带参数的宏的用法;本程序只使用了一种方法操作GPIO,前文已经讲述到STM32 GPIO操作的灵活与多样性,建议读者自行开掘多种操作方法。前文强调了两个LED为共阴接法,表示使用STM32的IO口输出电流来驱动LED。鉴于STM32的IO强大的驱动能力,这样做完全是可以的。但仍然建议在允许的情
24、况下尽量使用共阳接法,使用外部电源驱动,以减轻主控芯片的负担。实验结果工程建设好之后按下F7编译,无错误与警告按下ctrl+F5进入仿真载入完毕,按下F5全速运行可以看到两个LED在点亮一小段时间之后熄灭,符合程序设计的预期。再加点GPIO的应用:GPIO_WriteBit(GPIOX,GPIO_Pin_X,Bit_RESET);/重置 GPIO_WriteBit(GPIOX,GPIO_Pin_X,(BitAction)0 x01);/写入1 GPIO_WriteBit(GPIOX,GPIO_Pin_X,(BitAction)0 x00);/写入0 GPIO_ReadInputDataBit(
25、GPIOX,GPIO_Pin_X);/读入IO 注释: GPIOX 可选择GPIOA,GPIOB,.GPIOE GPIO_Pin_X 可以选择GPIO_Pin_0,GPIO_Pin_1.这个最好看下STM32的手册,以及自己的硬件电路.常用的GPIO操作函数 :uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 读GPIO某一位的输入 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 读GPIO的输入 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 读GPIO某一位的输出 u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论