一.预备知识
使用51单片机控制IO口相对来说要简单得多,最小系统搭建完毕后直接通过软件往各IO口写“1”或者写“0”即可。但使用STM32控制IO口输入输出却远没有这么容易,经过一个下午的查阅文献及探索后,略微有了头绪。
个人所使用的STM32F103VBT6有100个引脚,其中有五组GPIO(GPIOA…GPIOE),每组有16个GPIO端口(GPIOx_Pin0…GPIOx_Pin15)共80个,每个GPIO端口都有:
两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH);
两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR);
一个32位置位/复位寄存器(GPIOx_BSRR);
一个16位复位寄存器(GPIOx_BRR);
和一个32位锁定寄存器(GPIOx_LCKR)。
其中各个寄存器的作用:
名称 | 寄存器 | 意义 |
端口配置寄存器 | GPIOx_CRL GPIOx_CRH | 配置GPIO工作模式 |
端口输入数据寄存器 | GPIOx_IDR | 读取GPIO输入状态 |
端口输出数据寄存器 | GPIOx_ODR | 控制GPIO输出状态 |
端口位设置/复位寄存器 | GPIOx_BSRR | 用于位操作GPIO的输出状态的:设置端口为0或1 |
端口位复位寄存器 | GPIOx_BRR | 用于位操作GPIO的输出状态的:设置端口为0 |
端口配置锁定寄存器 | GPIOx_LCKR | 端口锁定后下次系统复位之前将不能再更改端口位的配置 |
每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。因此,要控制GPIOC端口,必须先使能APB2时钟。此外,STM32初始化外设第一步就是开启APB时钟。(时钟部分知识暂时知道该如此,往后再学习。)
关于GPIO各寄存器的描述:
端口配置低寄存器(GPIOx_CRL)(x=A..E):
端口配置高寄存器(GPIOx_CRH)(x=A..E):
端口输入数据寄存器(GPIOx_IDR)(x=A..E):
端口输出数据寄存器(GPIOx_ODR)(x=A..E):
端口位设置/复位寄存器(GPIOx_BSRR)(x=A..E):
端口位复位寄存器(GPIOx_BRR)(x=A..E):
端口配置锁定寄存器(GPIOx_LCKR)(x=A..E):
当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。
各寄存器地址:
GPIOC_CRL:0x40011000
GPIOC_CRH:0x40011004
GPIOC_ODR:0x4001100C
GPIOC_BSRR:0x40011010
GPIOC_BRR:0x40011014
RCC_APB2ENR:0x40021018
二.点亮LED灯
外部LED灯原理图:
编程思路:
1. 定义各寄存器地址
2. 使能APB2时钟
3. 配置GPIOC各端口输出模式
4. 利用BRR、BSRR、ODR寄存器点亮LED灯并循环流水灯
具体编程:
新建工程并设置好环境,添加c文件,键入如下程序:
//**********************************************
//* 通过直接操作存储器控制GPIO输出点亮LED灯 *
//* LED1=GPIOC_Pin6; *
//* LED2=GPIOC_Pin7; *
//* LED3=GPIOC_Pin8; *
//* LED4=GPIOC_Pin9; *
//* ------------------Sah_Pah----------------- *
//**********************************************
#include //定义各寄存器地址 #define GPIOC_CRL (* (volatile unsigned long *)(0x40011000)) #define GPIOC_CRH (* (volatile unsigned long *)(0x40011004)) #define GPIOC_ODR (* (volatile unsigned long *)(0x4001100C)) #define GPIOC_BSRR (* (volatile unsigned long *)(0x40011010)) #define GPIOC_BRR (* (volatile unsigned long *)(0x40011014)) #define RCC_APB2ENR (*(volatile unsigned long *)(0x40021018)) //设置GPIOC_Pin6,Pin7,Pin8,Pin9为推挽输出模式,最大速度50MHz #define _GPIOC_CRL 0x33000000 #define _GPIOC_CRH 0x00000033 void delay(void); void main(void) { volatile int i; //使能APB2的PORTC时钟 RCC_APB2ENR |=(1<<4); //设置GPIOC_Pin6,Pin7,Pin8,Pin9为推挽输出模式,最大速度50MHz GPIOC_CRL = _GPIOC_CRL; GPIOC_CRH = _GPIOC_CRH; while(1) { delay(); //利用端口位复位寄存器BRR清除GPIOC各端口的ODR位为0 GPIOC_BRR=0xFFFF; delay(); //利用端口位设置/复位寄存器BSRR将P6、P7、P8、P9口置1,点亮LED灯 GPIOC_BSRR=0x000003C0; delay(); //重复三次,偷懒就不写循环了 GPIOC_BRR=0xFFFF; delay(); GPIOC_BSRR=0x000003C0; delay(); GPIOC_BRR=0xFFFF; delay(); GPIOC_BSRR=0x000003C0; delay(); GPIOC_BRR=0xFFFF; //利用端口输出数据寄存器ODR进行流水灯循环 for(i=0;i<3;i++) { //P6脚置1 GPIOC_ODR=0x0040; delay(); //清0 GPIOC_ODR=0x0000; //P7脚置1 GPIOC_ODR=0x0080; delay(); GPIOC_ODR=0x0000; //P8脚置1 GPIOC_ODR=0x0100; delay(); GPIOC_ODR=0x0000; //P9脚置1 GPIOC_ODR=0x0200; delay(); } } } //定义延迟函数 void delay(void) { unsigned long j,n=100000; while(n--) { j=12; while(j--); } } 最终结果: 保存编译后,将程序烧写到开发板上,板上四个LED等闪烁三次后以流水灯形式循环三次。 三.参考文献 [1]半壶水,《STM32菜鸟学习手册-罗嗦版》, http://wenku.baidu.com/view/fc7c7d20ccbff121dd3683da.html,2012-08-19. [2]电脑圈圈.自己动手创建一个基于万利STM32板的IAR工程[EB/OL].http://blog.21ic.com/user1/2198/archives/2008/48929.html,2008-07-02/2012-08-19. [3]Changing.用stm32点个灯[操作寄存器+库函数][EB/OL].http://www.ichanging.org/stm32_gpio_led.html, 2012-06-29/2012-08-19.
上一篇:STM32 (3) GPIO口功能讲解 GPIO 口输入输出 寄存器配置
下一篇:使用STM32GPIO端口点亮LED灯(库函数)
推荐阅读
史海拾趣
Gem Asia Enterprise最初是一家专注于电子元件生产的小型制造商。面对激烈的市场竞争,公司决定加大研发投入,专注于开发新型半导体材料。经过数年努力,Gem Asia成功研发出一种高效能、低功耗的半导体材料,并成功应用于智能手机和可穿戴设备中。这一创新不仅显著提升了产品的市场竞争力,还吸引了多家国际知名电子品牌的合作,使Gem Asia迅速在电子行业中崭露头角。
随着全球对环保和节能问题的日益关注,Heatron公司积极响应号召,致力于研发和生产环保节能的电加热产品。公司投入大量资源于新材料、新技术的研发中,成功推出了一系列低能耗、高效率的加热器产品。这些产品不仅满足了市场对环保节能的需求,还进一步巩固了Heatron在电子行业中的领先地位。
面对未来电子行业的发展趋势和市场变化,CAT制定了明确的发展战略和布局。公司将继续加大研发投入,推动技术创新和产业升级;同时,积极拓展新的应用领域和市场空间,寻求与更多合作伙伴的共赢发展。此外,CAT还将注重人才培养和团队建设,为公司的长远发展提供坚实的人才保障。
通过以上五个故事,我们可以看到Capital Advanced Technologies公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和战略布局等方面的不断努力,逐渐成为了电子行业的领军企业。
品质管理是CAT发展的重要保障。公司建立了严格的质量管理体系,从原材料采购到产品制造、检验、包装等各个环节都进行严格的品质控制。CAT还注重与客户的沟通与协作,及时了解客户需求,为客户提供个性化的解决方案和优质的售后服务。这些举措使得CAT赢得了客户的广泛信赖和长期合作。
作为欧洲最领先的生产商之一,EMS GmbH公司与各大国际整车厂建立了长期稳定的合作关系。这些合作不仅为公司带来了稳定的订单和收入来源,还使EMS GmbH能够深入了解市场需求和技术趋势,从而不断优化产品和服务。通过与国际整车厂的紧密合作,EMS GmbH公司在汽车转换器注塑件领域赢得了良好的口碑和声誉。
品质是Base Two (2) Systems的生命线。公司始终坚持严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品在市场上赢得了客户的广泛信赖。许多客户与公司建立了长期稳定的合作关系,成为公司发展的重要支撑。
1. 在vhdl代码中为什么有时要使用arith程序包呢? 2. msb_sum: INTEGER :=15; 那么msb_sum /2应该等于7还是等于8呢?为什么? … 查看全部问答∨ |
|
两个Bulk in Endpoint,在Read函数中怎样区分?---DS NTSTATUS UCANDevice::Read(KIrp I) { t << "Entering UCANDevice::Read, " << I << EOL; // TODO: Check the incoming request. Replace "FALSE" in the following // line with a check that returns TRUE if the re ...… 查看全部问答∨ |
|
本帖最后由 dontium 于 2015-1-23 13:21 编辑 用贵公司的仿真器,自制5509小系统, 硬件仿真正常,可以出现预期结果, 但烧到串行flash里面后无法自举, 怎么检查出现问题的原因? 我用的是mcbspo口接串行flash, GPIO的配置没有问题, flas ...… 查看全部问答∨ |
|
MSP-EXP430FR5969开发板energyTrace问题 新买的MSP-EXP430FR5969开发板,试了一下energyTrace,遇到一些问题。 请教大牛,顺便和大家讨论。 energyTrace测功耗的功能准吗? 跑了一下LPM4的例程energyTrace结果如图,140uA是不是有点高啊(还没具体看手册和程序),之前用过一个FR5728 ...… 查看全部问答∨ |