一.预备知识
使用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灯(库函数)
推荐阅读
史海拾趣
BOOKLY公司在技术创新的基础上,积极拓展市场。通过与各大电子产品制造商建立合作伙伴关系,BOOKLY的产品迅速进入全球市场。公司还积极参与国际电子展览和技术交流会,展示其最新研发成果,吸引了众多合作伙伴和投资者的关注。通过不断的市场拓展和合作,BOOKLY逐渐成为了电子行业的领军企业。
AirBorn公司成立于1958年,总部位于得克萨斯州奥斯汀。在创立之初,AirBorn就致力于设计、制造和销售高性能连接器和电缆组件。随着电子技术的飞速发展,AirBorn敏锐地捕捉到航空航天领域对高性能连接器的需求,并开始了针对这一领域的定制化产品研发。凭借卓越的技术实力和创新能力,AirBorn很快在航空航天连接器市场占据了一席之地。
近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。
在追求经济效益的同时,AE&ST公司也积极履行社会责任,致力于可持续发展。公司严格遵守环保法规,采用环保材料和工艺,减少生产过程中的污染排放。此外,公司还积极参与社会公益活动,支持教育事业和科技创新。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。
请注意,这些故事是基于一般电子行业发展趋势和常见模式构建的虚构故事,旨在展示一个电子公司可能的发展路径。对于AE&ST公司的实际情况,建议查阅相关官方资料或行业报告以获取准确信息。
随着公司业务的不断拓展,Daniel Woodhead公司意识到人才是企业发展的核心。因此,公司加大了对研发团队的投入,引进了一批业界顶尖的技术人才。这些人才的加入不仅为公司带来了更多的创新思路,还提高了整体的技术水平。在团队的共同努力下,公司不断推出具有竞争力的新产品,进一步巩固了市场地位。
随着全球市场的不断变化和公司规模的扩大,Cal Test Electronics开始实施全球化战略。公司积极拓展海外市场,通过参加国际展会、建立海外销售渠道等方式,提高品牌知名度和市场份额。同时,公司还加强与国际同行的合作与交流,引进先进的技术和管理经验,不断提升自身的竞争力。这些努力使得Cal Test Electronics逐渐成为一个具有全球影响力的电子配件和测试产品制造商。
这些故事旨在展示Cal Test Electronics公司可能的发展轨迹和成就,但并非基于实际发生的事件。对于该公司的真实发展历程和故事,建议查阅相关官方资料或行业报告以获取更准确的信息。
基于最新款飞思卡尔片子(MC9S08AC32)的实际应用代码 如题所说. 对于想使用这款飞思卡尔芯片,MC9S08AC32,FLASH有32K的同志位来说,我认为这个片子做得不错了,你们可以试着尝试一下,飞思卡尔是俺使用过的代码中,我觉得相对来说,抗干扰性较强的一款片子. 这里有一些代码,可以帮你迅速入门,迅速走入开发.… 查看全部问答∨ |
|
8255引脚电平变化无法读取 #define PA8255 (*((unsigned char xdata *)0x1fff))//总线地址 #define PB8255 (*((unsigned char xdata *)0x3fff))//总线地址用16位表示 p0是低八位 p2是高八位 #define PC8255 (*((unsigned char xdat ...… 查看全部问答∨ |
|
如题。 我自己定制了一个PB,编译好了后,把SDK导出了,但是这个SDK是要安装在VS2005的安装目录下吗??(我用的开发 工具是VS2005,但是是第一次使用)安装完了SDK,在启动VS2005,新建工程时,需要对它进行选择吗????… 查看全部问答∨ |
|
Getting Started with the MSP430 LaunchPad_Student Guide and Lab Manual 内容和大课堂的内容差不多,只不过是英文的。 大家看看!… 查看全部问答∨ |