历史上的今天
今天是: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按钮运行程序。

效果如下。

史海拾趣
|
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核心板方案: CPU:PXA270 SDRAM:128M FLASH:32M 接口:USB、SDCARD、SERIAL等 LCD+TOUCH:3.5‘ 支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE5 ...… 查看全部问答> |
|
转自:http://www.arm9home.net/read.php?tid-8062.html经过几天的不懈努力,友善之臂现在已经实现了Linux版本的硬解码播放器,它基于开源的SMPlayer,充分发挥了三星多媒体硬解码Linux驱动,在全屏播放时采用了Post Processor技术实现硬缩放,因此 ...… 查看全部问答> |
|
刚准备采购103RCT6,冲着它的内部RAM是48K,我正好需要这么大的,结果经销商告诉我它的内部RAM是32K的,看选型手册,103系列64脚的内部RAM分别是6K\\10k\\20K\\20K\\48K\\64K\\64K,从20K直接跨到了48K,经销商振振有词的说STM32的RAM跨度没那 ...… 查看全部问答> |
|
当我和厂里的师傅们在为了使数控机床提高一级精度而不分白夜进行调试、翻译德文资料时,当我费尽千辛万苦又没有假期和加班费、满身污垢,满手是伤,操作失败了无数次但最终第一次加工制造出精度达到预计的0.0001毫米要求的样品时,我兴奋了一阵子, ...… 查看全部问答> |
|
学习笔记分享】【MSP430学习笔记】IAR开发环境中的数据、函数定位方法 IAR集成开发环境下,变量和函数的定位方法。 qq:906411450 triton.zhang [ 本帖最后由 Triton.zhang 于 2011-9-2 08:47 编辑 ]… 查看全部问答> |
|
我现在有套系统,FPGA 驱动AD采样,采样结果想通过VGA来显示出波形,我的做法是将ad结果存入fpga内部DPRAM中(注:没有外扩sdram)。然后让vga从DPRAM中读出数据显示。ad是12位的,我每次采样420个点,想在800*600中间的420*400区域中来显示。我的想 ...… 查看全部问答> |




