历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2019年09月11日 | 嵌入式固件开发之二——直接操作STM32寄存器的LED点灯

2019-09-11 来源:eefocus

2 直接操作STM32寄存器的LED点灯测试程序

2.1 创建并编译工程

双击桌面上的“Keil uVision5”图标,启动MDK。


点击“Project”->“New uVision Project…”菜单项,打开工程创建向导。


选择工程目录,设置工程名字,点击保存。


在接下来的对话框中选择对应的SoC,点击“OK”。

在接下来的对话框中选择最基本的运行时软件组件,点击“OK”。

管理工程的项目。点击如下的图标,启动管理程序。


设置目标的名字为“STM32F103”,第一个组的名字为“Sources”,这些名字都可以根据需要任意取名。如下图所示,设置好后,点击“OK”完成工程的项目管理。

设置完成后,会在MDK集成开发环境的左边看到如下的树形目录结构。


新建源文件,并进行保存。

将新建的文件加入到工程中。

编写源代码。在新建的文件中加入以下代码,然后保存。

int main(void)

{

         int i;

 

         unsigned int *GPIOB_CRL = (unsigned int *)0x40010C00;

         unsigned int *GPIOB_BSRR = (unsigned int *)0x40010C10;

         unsigned int *RCC_APB2ENR = (unsigned int *)0x40021018;

 

         *RCC_APB2ENR = 0x8;

         *GPIOB_CRL = 0x44244444;

 

         while (1) {

                   for (i = 0; i < 1000000; i++);

                   *GPIOB_BSRR = 0x20;

                   for (i = 0; i < 1000000; i++);

                   *GPIOB_BSRR = 0x200000;

         }

}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------


这里解释一下上面的代码:


嵌入式外设基本都是通过操作一组特殊功能寄存器(SFR)来驱动硬件工作的,要能编写出能够使外设正常工作的代码就需要了解硬件的工作原理并熟读手册中的寄存器说明。下图是STM32F103的系统总线结构。

从上图中我们可以看到,我们编程的对象GPIOB是挂在APB2外设总线上的,编程GPIOB也就可能会和APB2产生联系。通过阅读芯片手册,发现一个相关的寄存器RCC_APB2ENR,这是一个挂接在APB2总线上的所有外设的时钟使能寄存器。时钟使能意味着外设可以在时钟的驱动下工作,所以他是GPIOB能工作的前提条件。查看寄存器,相应的描述如下:

所以*RCC_APB2ENR = 8的作用就是开始GPIOB的时钟。


GPIO管脚的功能是复用的,可以做输入,可以做输出,要驱动LED发光,管脚应该被配置成输出模式。GPIOx_CRx是端口配置的寄存器,每个端口用4个比特来控制,16个端口需要64个比特,也就使用了两个寄存器。对于GPIOB,这两个寄存器分别是GPIOB_CRL和GPIOB_CRH,GPIOB5对应的比特位为GPIOB_CRL[23:20],这4个比特位有不同的组合,决定了不同的管脚功能。


如果这4个比特位为0010,那么管脚为通用推挽输出,最大速率为2MHz。


语句*GPIOB_CRL = 0x44244444的作用就是将GPIOB5设为上面的输出模式,其他管脚保持复位的默认配置不变。


将管脚配置成输出后,就可以控制管脚输出高低电平,从而来控制LED的亮灭。GPIOx_BSRR寄存器用于该目的,该寄存器非常简单,高16位用于清除操作,即可使输出为低电平,低16位用于设置操作,即可使输出为高电平。

在上面的while循环中,先置位bit5,输出高电平,根据原理图,LED熄灭;延时后置位bit21,输出低电平,LED点亮,延时后循环进行,那么LED闪烁。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------


编译工程。点击下图中两个工具按钮的其中之一都可以编译工程(左边一个按钮只重新编译修改的,速度更快,右边一个按钮是重新编译整个工程)。


如果没有问题,那么编译输出将会出现如下内容。


2.2 仿真

设置工程选项。点击如下图所示的工具栏按钮,打开工程选项设置按钮。

在Target选项卡中设置晶振频率为8MHz。

在Debug选项卡中设置使用仿真器进行调试,并设置动态库和参数,然后点击“OK”。


点击调试按钮开始调试,如下图所示。


选择查看外设。

启动逻辑分析仪。

在逻辑分析仪中查设置需要分析的信号,然后点击“Close”。

点击run按钮运行程序。

效果如下。


推荐阅读

史海拾趣

博巨兴公司的发展小趣事

2005年,博巨兴公司的业绩取得了突破性进展,全年业绩突破5000万元。这一年,公司还与世平科技有限公司展开了战略合作,共同推动芯片行业的发展。此外,公司还成功取得了台湾义隆公司在华东地区的代理权,进一步拓展了市场份额。

Heatron LED Integration公司的发展小趣事

随着LED照明市场的不断扩大,Heatron LED Integration凭借敏锐的市场洞察力,迅速调整市场战略。公司不仅巩固了在国内市场的领先地位,还积极开拓国际市场,与多家国际知名企业建立了长期合作关系。通过参加国际展会、设立海外分支机构等方式,公司成功将产品推向全球多个国家和地区,实现了品牌的国际化。

E Connector Solutions公司的发展小趣事

人才是企业发展的核心竞争力。E Connector Solutions公司高度重视人才培养和团队建设。公司建立了完善的人才培养机制,通过内部培训、外部引进等方式不断提升员工的专业技能和综合素质。同时,公司还注重团队建设,鼓励员工之间的协作与交流,营造积极向上的工作氛围。这种注重人才培养和团队建设的做法为公司的发展提供了坚实的人才保障。

请注意,以上故事均为虚构,旨在为您提供一个关于电子连接器解决方案公司发展起来的故事框架。如果您需要了解特定公司的具体发展情况,建议您查阅相关公司的官方网站或行业报告。

芯佰微(Corebai)公司的发展小趣事

作为一家有社会责任感的企业,芯佰微始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,芯佰微也积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了公司的社会责任担当,也为其赢得了更多客户和合作伙伴的信任和支持。

ELANTEC (Renesas )公司的发展小趣事

作为一家半导体公司,技术突破和创新是ELANTEC发展的核心动力。在移动通信领域,ELANTEC不断推出具有创新性的产品和技术,如低功耗、高性能的移动通信芯片等。此外,在汽车电子、工业控制等领域,ELANTEC也取得了多项技术突破,为客户提供了更加优质的产品和服务。

Diconex公司的发展小趣事

人才是企业发展的核心动力。Diconex公司高度重视人才培养和引进工作。公司建立了完善的人才培养机制,为员工提供广阔的发展空间和良好的职业晋升通道。同时,公司还积极引进行业优秀人才,为公司的快速发展提供了有力的人才保障。这种人才战略的成功实施使得Diconex在电子行业中拥有了强大的技术团队和人才队伍。

问答坊 | AI 解惑

如果写磁盘时突然停电。。。。

硬盘会如何处理?比如正在写一个扇区的时候停电了,那这个扇区是不是只有一部分数据被写入了,还是硬盘能保证要么扇区全部被写入,要么就不写??…

查看全部问答>

DirectDraw问题

1>.\\YX_GPS\\port\\c\\yu_port_gui.c(79) : error C2039: \'Release\' : is not a member of \'IDirectDrawSurface\' 1>        D:\\Program Files\\Windows CE Tools\\wce500\\STANDARDSDK_500\\include\\ARMV4I\ ...…

查看全部问答>

PXA270核心板方案:

PXA270核心板方案:    CPU:PXA270    SDRAM:128M    FLASH:32M    接口:USB、SDCARD、SERIAL等    LCD+TOUCH:3.5‘    支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE5 ...…

查看全部问答>

首家实现6410平台Linux硬解码播放器

转自:http://www.arm9home.net/read.php?tid-8062.html经过几天的不懈努力,友善之臂现在已经实现了Linux版本的硬解码播放器,它基于开源的SMPlayer,充分发挥了三星多媒体硬解码Linux驱动,在全屏播放时采用了Post Processor技术实现硬缩放,因此 ...…

查看全部问答>

乱了乱了,103RCT6内部RAM是多少K的?

刚准备采购103RCT6,冲着它的内部RAM是48K,我正好需要这么大的,结果经销商告诉我它的内部RAM是32K的,看选型手册,103系列64脚的内部RAM分别是6K\\10k\\20K\\20K\\48K\\64K\\64K,从20K直接跨到了48K,经销商振振有词的说STM32的RAM跨度没那 ...…

查看全部问答>

月薪1500的军工工程师的自白 (转载)

当我和厂里的师傅们在为了使数控机床提高一级精度而不分白夜进行调试、翻译德文资料时,当我费尽千辛万苦又没有假期和加班费、满身污垢,满手是伤,操作失败了无数次但最终第一次加工制造出精度达到预计的0.0001毫米要求的样品时,我兴奋了一阵子, ...…

查看全部问答>

学习笔记分享】【MSP430学习笔记】IAR开发环境中的数据、函数定位方法

IAR集成开发环境下,变量和函数的定位方法。       qq:906411450 triton.zhang [ 本帖最后由 Triton.zhang 于 2011-9-2 08:47 编辑 ]…

查看全部问答>

求助一个vga显示波形的问题

我现在有套系统,FPGA 驱动AD采样,采样结果想通过VGA来显示出波形,我的做法是将ad结果存入fpga内部DPRAM中(注:没有外扩sdram)。然后让vga从DPRAM中读出数据显示。ad是12位的,我每次采样420个点,想在800*600中间的420*400区域中来显示。我的想 ...…

查看全部问答>