使用Keil MDK运行第一个STM32程序

发布者:哈哈哈33最新更新时间:2022-01-27 来源: eefocus关键字:Keil  MDK  运行  STM32程序 手机看文章 扫描二维码
随时随地手机看文章

1.1.1 使用Keil MDK运行第一个STM32F10X程序

在上一小节中已经详细介绍了使用Keil MDK和标准外设库创建一个工程的过程,下面将介绍基于这个工程来编写一个小程序,通过这个程序我们可以初步了解:

  1. STM32标准外设库的简单使用过程

  2. STM32外设的使用方法和大致流程

  3. 程序的编译、链接、下载步骤

  4.  利用Keil MDK的在线仿真功能进行软件仿真的简要步骤


1. 程序的编写

(1)程序实现的功能

为了方便各位读者的入门和理解,这个小程序的功能非常简单,作为本书功能实践的第一个程序,其功能当然也是最为经典的“Hello World!”了,只不过不是简单的屏幕输出,而是利用硬件的串口进行输出,同时作为单片机类的第一个程序自然少不了LED闪烁的功能,这就是这个小程序的两个主要的功能:

l 利用串口1输出“Hello World!”字符。

l 控制两个LED闪烁。


(2)程序的实现

在基于标准外设库进行程序开发时一定要充分利用标准外设库下面的帮助文件stm32f10x_stdperiph_lib_um.chm以及库中自带的工程实例,同时结合STM32F10x系列的芯片手册来完成程序的开发,stm32f10x_stdperiph_lib_um.chm帮助文件如图 5‑25所示。此文件中已经包含了标准外设库的全部内容,并根据根据内容结构进行了重新的编排和整理,更加方便程序的阅读和理解。


STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Examples文件夹下包括了众多外设的使用例程,这里的例程多是针对官方的开发板而编写,然而这些例程却非常全面的展示了相关外设的各种使用方法,对我们做基于标准外设库的开发有着非常重要的意义。

clip_image002[6]

图 5‑25 标准外设库的帮助文档

我们的第一个程序就通过这些参考来完成,首先来看串口部分。串口部分的详细信息可以参考本书第8章,这儿只进行简单的说明和介绍简便的开发方法,首先先找一个与我们使用的功能最近的一个例程,STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_ExamplesUSART文件夹下给出了多达12中的USART例程,这里选择较为相近的Interrupt文件夹下得例程,打开文件夹下面的mian.c文件,通过简单的浏览可以找到如下一段程序:


/* USARTy and USARTz configuration ------------------------------------------------------*/


/* USARTy and USARTz configured as follow:


- BaudRate = 9600 baud


- Word Length = 8 Bits


- One Stop Bit


- No parity


- Hardware flow control disabled (RTS and CTS signals)


- Receive and transmit enabled


*/


USART_InitStructure.USART_BaudRate = 9600;


USART_InitStructure.USART_WordLength = USART_WordLength_8b;


USART_InitStructure.USART_StopBits = USART_StopBits_1;


USART_InitStructure.USART_Parity = USART_Parity_No;


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


/* Configure USARTy */


USART_Init(USARTy, &USART_InitStructure);


/* Configure USARTz */


USART_Init(USARTz, &USART_InitStructure);


/* Enable USARTy Receive and Transmit interrupts */


USART_ITConfig(USARTy, USART_IT_RXNE, ENABLE);


USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);


/* Enable USARTz Receive and Transmit interrupts */


USART_ITConfig(USARTz, USART_IT_RXNE, ENABLE);


USART_ITConfig(USARTz, USART_IT_TXE, ENABLE);


/* Enable the USARTy */


USART_Cmd(USARTy, ENABLE);


/* Enable the USARTz */


USART_Cmd(USARTz, ENABLE);


上面的这段的程序配合注释可以很容易理解,USART_InitTypeDef定义了一个包括USART主要参数的结构体,因此首先对USART的相关参数进行配置,使用标准外设库进行配置的优势就体现出来了,通过程序可以很容易读出这个串口的配置:

l 波特率9600Kbps

l 数据长度8

l 停止位1

l 奇偶校验:无

l 硬件流控制:无

l 工作模式:收、发


然后利用USART_Init函数进行初始化,这段程序中设置了两个串口,使用同样的配置,然后配置相应的中断。最后通过USART_Cmd函数使能相应的串口,前面有过介绍,这些例程里的程序是针对官方的开发套件的,因此程序中并没有指名具体的端口,而是使用了宏定义USARTy、USARTz。通过这段程序就可以很方便的更改相关的参数得到我们需要的配置程序。


这儿只是完成了USART的配置,下面来看一下对应的I/O设置,仍然在这个文件中可以找到GPIO_Configuration(void)这个函数,程序如下:


void GPIO_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


#ifdef USE_STM3210C_EVAL


/* Enable the USART3 Pins Software Remapping */


GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);


/* Enable the USART2 Pins Software Remapping */


GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);


#elif defined USE_STM3210B_EVAL || defined USE_STM32100B_EVAL


/* Enable the USART2 Pins Software Remapping */


GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);


#endif


/* Configure USARTy Rx as input floating */


GPIO_InitStructure.GPIO_Pin = USARTy_RxPin;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);


/* Configure USARTz Rx as input floating */


GPIO_InitStructure.GPIO_Pin = USARTz_RxPin;


GPIO_Init(USARTz_GPIO, &GPIO_InitStructure);


/* Configure USARTy Tx as alternate function push-pull */


GPIO_InitStructure.GPIO_Pin = USARTy_TxPin;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);


/* Configure USARTz Tx as alternate function push-pull */


GPIO_InitStructure.GPIO_Pin = USARTz_TxPin;


GPIO_Init(USARTz_GPIO, &GPIO_InitStructure);


}


这段函数完成了相关的I/O配置,首先通过宏定义判断是官方的哪一款开发套件,然后进行相应的端口映射(端口映射请参加官方的数据手册),然后进行相应的端口配置,同串口配置一样,这段程序中德端口用的也是宏定义USARTy_RxPin替代的,改为我们使用的实际I/O,端口时钟设置为50MHz,串口所使用到的端口设置为复用(GPIO_Mode_AF_PP)完成端口初始化。


另外仍然通过观察这个例程可以很容易发现,在使用一个外设时还需要首先打开对应的外设时钟,这部分程序如下:


void RCC_Configuration(void)


{


/* Enable GPIO clock */


RCC_APB2PeriphClockCmd(USARTy_GPIO_CLK | USARTz_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);


#ifndef USE_STM3210C_EVAL


/* Enable USARTy Clock */


RCC_APB2PeriphClockCmd(USARTy_CLK, ENABLE);


#else


/* Enable USARTy Clock */


RCC_APB1PeriphClockCmd(USARTy_CLK, ENABLE);


#endif


/* Enable USARTz Clock */


RCC_APB1PeriphClockCmd(USARTz_CLK, ENABLE);


}


这段程序中需要注意两点,首先,GPIO、USART等都是连在APB1、APB2两条总线上的,各外设具体的总线连接情况参见图 5‑2,因此首先应该确定外设对应的总线,例如USART1是APB2总线,而USART2是APB1总线。其次使能相应的时钟时不光要使能对应的I/O端口,还要使能总线的复用端口,这点也容易忽略。


最后根据库中的例程,借鉴库中例程的编写风格,就可以得出我们需要的程序,程序在工程的mian.c中编写,函数如下:


#include "stm32f10x.h"


void USART_Configuration(void);


void GPIO_Configuration(void);


void Delay(__IO uint32_t nCount);


void USART1_Puts(char * str);


int main(void)


{


USART_Configuration();


GPIO_Configuration();


USART1_Puts("Hello Wrold!n");


while (1)


{


GPIOF->BSRR = 0x000000C0;


Delay(0xAFFFF);


GPIOF->BRR = 0x000000C0;


Delay(0xAFFFF);


USART1_Puts("Hello Wrold!n");


}


}


void USART_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


USART_InitTypeDef USART_InitStructure;


//使能串口、串口所用的I/O口以及端口复用时钟


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);


/* A9 USART1_Tx */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX


GPIO_Init(GPIOA,&GPIO_InitStructure);


/* A10 USART1_Rx */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX


GPIO_Init(GPIOA, &GPIO_InitStructure);


USART_InitStructure.USART_BaudRate = 9600;


USART_InitStructure.USART_WordLength = USART_WordLength_8b;


USART_InitStructure.USART_StopBits = USART_StopBits_1;


USART_InitStructure.USART_Parity = USART_Parity_No;


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


USART_Init(USART1, &USART_InitStructure);


/* Enable the USARTx */


USART_Cmd(USART1, ENABLE);


}


void GPIO_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);


/* 设置LED对应的引脚 */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOF, &GPIO_InitStructure);


}


void Delay(__IO uint32_t nCount)


{


for(; nCount != 0; nCount--);


}


void USART1_Puts(char * str)


{


while(*str)


{


USART_SendData(USART1, *str++);


/* Loop until the end of transmission */


while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);


}


}


至此完成了主函数的编写。接下来还需要到stm32f10x_conf.h文件中选择相应的头文件,这儿去掉需要使用的头文件之前的注释,去掉注释的头文件如下:

l #include "stm32f10x_gpio.h"

l #include "stm32f10x_gpio.h"

l #include "stm32f10x_usart.h"

这样,我们的程序编写就完成了,下面可以进行我们的编译与调试了。


2. 程序的编译

在Keil MDK的工具栏上自左至右依次有clip_image004[6]三个图标,分别为编译指定文件、生成工程、重新生成所有工程。首先在mian.c下点击编译图标,如果编译没有错误,则输出窗口如图 5‑26所示。如果编译存在错误,点击错误的地方可以直接定位到错误行,根据错误提示进行修改。

clip_image006[6]

图 5‑26 编译输出窗口

编译不存在错误后点击clip_image008[6]图标生成工程,生成没有错误则输入如图 5‑27所示。如果存在错哦无则可以直接点击对应的错误跳转到对应的文件对应的行,根据错误提示进行再次修改。

clip_image010[6]

图 5‑27 生成工程输出窗口

第一次生成工程成功以后,如果修改了相应的文件再次点击生成工程时只会对有改动的文件进行重新编译、生成,而重新生成全部工程会重新生成工程中的所有文件。


3. 程序的调试

在实际开发时,可以首先利用软件进行仿真,利用软件进行仿真查看具体的寄存器配置,外设的工作情况等,同时通过断点的配合可以查找出程序中绝大多数的错误。软件仿真完成后可以下载到硬件平台去运行,如果程序仍然没有达到需要的效果,在硬件检查完成后可以使用在线仿真的方式,在硬件平台上直接运行程序,进一步查找问题。


首先,先看一下这个小程序的软件仿真,首先在工程设置Debug选项中选择使用软件模拟,如图 5‑28所示。

clip_image012[6]

图 5‑28 Debug设置选项窗口

点击clip_image014[6]图标,或者从菜单栏-Debug启动调试。启动后界面如图 5‑29所示。调试启动后自动运行到主程序。

clip_image016[6]

图 5‑29 调试主界面

在工具栏可以找到与调试相关的快捷图标clip_image018[6],同样在菜单栏Debug菜单下可以找到对应的选项,自左向右分别为复位,运行,点击后直接运行程序;停止,运行时点击停止当前运行;单步,单步执行当前程序;跳过,可以直接跳过子函数的运行;跳出,在某个子函数中运行时可以直接跳出当前函数;运行到光标位置处。

在程序行号的左侧直接双击可以非常方便的添加或者取消断点,如图 5‑30所示。

clip_image020[6]

图 5‑30 断点的添加与取消


在菜单Peripherals中可以打开需要查看的外设,这里点击Peripherals-USART1弹出USART1的相关观察窗口,点击运行后,窗口如图 5‑31所示,就会显示运行的程序对USART1所完成的相关配置。从中可以清晰的看出,程序对USART1的相关寄存器配置,从地面Settings一栏中则可以直观的看出USART1当前的工作状态,从这儿就可以检查我们的相关参数设置正确与否,对应时钟有无开启等。需要说明的是这里寄存器在进行仿真的时候是可以进行改写的,也就是说允许我们在程序运行的时候直接进行相关的操作来观察运行结果。但是此时程序本身也是可以对寄存器进行操作的,因此直接更改相应的寄存器观察时还要注意你的操作是否和程序冲突。例如在本程序的运行过程中如果将寄存器中发送使能TE的勾给去掉,则串口就不会在输出数据。

clip_image022[6]

图 5‑31 USART1寄存器观察窗口

接下来继续查看I/O的配置,本程序中使用的是F端口,则点击菜单Peripherals-General-Purpose I/O,选择GPIOF,出现GPIOF的配置窗口,程序运行后可以通过窗口查看GPIOF的相关配置,如图 5‑32所示。在这个窗口中可以查看引脚的配置情况,当程序运行时就能看到对应引脚的勾在闪烁。

clip_image024[6]

图 5‑32 GPIOF寄存器观察窗口

通过这些操作,可以非常方便、直观的查看程序运行后对应的配置是否与我们预想的一致,那么在本程序中通过串口输出了“Hello World!”又该怎样查看运行结果呢?在工具栏clip_image026[6]中可以非常方便的打开相应的查看窗口,查看相关寄存器和外设等。由于我们需要使用串口1输出字符,同时LED闪烁显示,因此首先打开串口1的输出,点击clip_image027[6]图标,弹出如所示下拉菜单,选择UART#1如图 5‑33所示,或者点击View菜单点击Serial Windows选择UART#1即可打开UART的输出窗口,运行程序后会在此窗口中输出串口信息,如图 5‑34所示。

clip_image029[6]

图 5‑33 打开UART1输出窗口

clip_image031[6]

图 5‑34 UART1输出窗口

至此,已经利用Keil MDK的软件仿真功能完成了程序的调试,看到了设计的效果。通过这个例子也能够让我们深刻的体会到Keil MDK在线调试功能的强大之处。接下来我们将编写好的程序下载到开发板中运行,看看运行效果。


4. 程序的下载

编写好的程序工程生成完成后下载到硬件平台的方法有很多种,一是直接利用Flash烧写工具烧写相应的hex文件,在工程配置时需要设置才能生成hex文件,具体设置参加图 5‑16,生成hex文件之后就可以利用烧写工具烧写到硬件平台,常用的仿真器都带有相应的软件工具,如笔者使用的JLink-V8,可以使用自带的J-Flash工具,使用J-Flash工具如图 5‑35所示,在工程管理中选择所使用的硬件平台,点击Target-Connect后就可以连接上硬件平台,在图中左侧显示了仿真器以及对应的硬件平台信息。然后选择所生产的hex文件,就可以讲编译的程序下载到硬件平台中。

clip_image033[6]

图 5‑35 J-Flash主界面

这种下载方式非常适合将程序源码不公开的情况下将程序固件提供给第三方使用,然而在使用Keil MDK时还有更为方便的方式,在工程设置中设置好了下载工具后可以点击clip_image035[6]图标,直接将程序下载到硬件平台中运行,非常方便。在使用仿真器进行在线仿真时也可以通过设置在在线仿真时将程序下载到flash中。


程序下载到硬件平台后通过实际的串口来查看程序运行情况了,将硬件平台的串口1连接至PC,笔记本等电脑上没有物理串口的可以使用USB转串口设备,注意在设备管理器中查看实际所分配的串口号,本机分配的串口号为COM4,如图 5‑36所示,串口号也可以在高级选项中进行更改。

clip_image037[6]

图 5‑36 设备管理器中查看串口号

这里使用本章所介绍的TKStudio中的串口调试助手工具来进行查看,设置串口的相应参数与程序一致,串口设置于运行结果如图 5‑37所示,从图中可以看出串口接数据正确,开发板上的两个LED也在不停闪烁。

clip_image039[6]

图 5‑37 串口调试助手运行界面

至此,我们完成了一个简单的程序开发过程。本小节通过实现串口输出与LED闪烁的功能系统的介绍了怎样基于标准外设库进行程序的开发与调试,这儿只是列举了一个非常简单的小例子,更多的联系读者可以参考标准外设库中的例程自行完成。

关键字:Keil  MDK  运行  STM32程序 引用地址:使用Keil MDK运行第一个STM32程序

上一篇:STM32开源开发环境的搭建
下一篇:STM32 上使用 USB Host 读写 U 盘

推荐阅读最新更新时间:2024-11-17 08:35

金立K30 Pro:运行Android 7.1.1系统 售价699元起
已经破产的金立仍然在推出手机,12月7日一款命名为金立K30 Pro的机型悄然上架电商平台,名字让人感觉有点碰瓷Redmi的意味。 金立 K30 Pro 采用 6.53 英寸 LCD 水滴屏设计,分辨率仅为 720×1560,内置 4000 毫安电池,充电功率未知,运行的竟是四年前的 Android 7.1.1 系统。核心配置方面,搭载一颗联发科主频为 2.0GHz 的处理器,具体型号暂未可知,存储组合有 6GB RAM+128GB ROM 与 8GB RAM+256GB ROM 两种,对应的售价为 699 元、799 元。   拍照方面,该机前置 800 万像素自拍摄像头,后置为圆形相机模组,位于正中间的是闪光
[手机便携]
STM32按键程序
u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(KEY3==1)return 4; }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
[单片机]
stm32 基于3.5 库 MDK 自建工程过程
从0开始 创建一个基于库的工程 第一步: 第二步:其它的就是产生hex 文件,list文件的路径,仿真器选择 下面这个单独列出来是因为没有设置, 生成文件就无法烧录。 第三步 尝试编译一下一下工程,报错是肯定的,来看看是什么错误。 第四步:添加启动文件 第五步:添加库文件 宏定义 头文件路径包含 穿插 MDK自带了一些头文件和库中的文件名是相同的,如果库文件没有添加,编译器就会用自带的文件替代 但是这些文件的内容和库文件中的内容有可能不太一样 第六部 自己写的头文件 stm32f10x_conf.h 头文件 之所以要自己写这个文件,是引文MDK自带文件和库
[单片机]
<font color='red'>stm32</font> 基于3.5 库 <font color='red'>MDK</font> 自建工程过程
案例说明stm32官方库函数使用方法 (库版本v3.5, Keil MDK 5)
stm32的官方库非常方便,但是里面的使用手册是英文的,而且也没有很详细的使用说明,对新手来说入门比较困难,而且网上现存的教程要么是针对v2.x的库的,要么是针对keil 4.x的,这两个东西更新后差别都蛮大。有新的可用为何不用最新的呢? 一: 用keil 5构建模板工程。在keil顶部选Project- New uVision Project, 输入工程名称,进入device选择界面。注意,因为keil 5变成了在线安装Package的模式(即刚安装好软件并不附带各种芯片的包,用哪个下哪个),如果你已经安装了ST的Package,不要用那个Package!!Keil 5暂时不兼容官方库,如果用了的话编译会报错。解决方案:1.
[单片机]
国网宁夏电力:攻关关键技术 助力直流外送通道安全运行
中国储能网讯: “7613断路器运行正常。”2月22日,宁夏±800千伏灵州换流站运维人员开展设备巡查和运行数据分析作业。灵州—绍兴±800千伏特高压直流工程(以下简称灵绍直流)累计向华东电网输送电能已超2000亿千瓦时。工程投运后,国网宁夏超高压公司自主研发断路器智能诊断数据分析系统,消除新设备源头隐患,保障换流站安全稳定运行。 宁夏电网是“西电东送”的重要送端,灵绍直流和宁东—山东±660千伏直流输电工程(以下简称银东直流)两大直流通道外送能力达1200万千瓦,“强电网、大送端”特征明显。灵绍直流、银东直流的很多设备均为国内首台首套,国网宁夏电力有限公司坚持创新驱动,以直流关键技术攻关助力两大直流外送通道安全稳定运
[新能源]
MDK(KEIL5)如何生成.bin文件
最近师傅要求我们利用keil5生成.bin文件,但是在网上查找了很多资料,也按照网上的方法来设计,但是结果都不如意,没有出来。今天早上有折腾了一段时间,历经千辛万苦,终于生成了.bin文件了。虽然写得有点啰嗦,看起来比较繁琐,但一步一步跟着操作,你会发现还是很简单的,下面分享一下,希望能帮到各位小伙伴。由于语言和能力不足,如果有错,还劳烦大佬斧正。 生产.bin文件方法有两种,一种是打开安装路径中的中的fromelf.exe,另一种是如我下图所示方法。下面我介绍下我所有的方法。 点击User栏,将Run#1打勾,并在后面的方框中填入生成.bin的路径。我的路径为: fromelf(一个空格) --bin(一个空格) -
[单片机]
<font color='red'>MDK</font>(<font color='red'>KEIL</font>5)如何生成.bin文件
keil 使用教程 编写第一个led灯程序
1、新建一个空文件夹 2、 打开 keil -- new uVision project 3、选择目录,命名文件 4、选择芯片 5、添加文件 6、编写 C51 单片机程序 根据自己画的电路图,确认引脚 我们这里写一个点亮一个led 灯的程序 p0.0 引脚 7、生成 可以加载单片机 里的 hex 文件 8、编译生成hex文件 9、将hex 文件导入单片机 打开 proteus ,双击 单片机
[单片机]
<font color='red'>keil</font> 使用教程 编写第一个led灯<font color='red'>程序</font>
Keil C51中对双数据指针的直接利用
在8051体系中,数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针,指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能。作为一种增强特性,有许多8051派生型器件支持双数据指针。以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个,仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换。当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时,所有对DPTR的操作使用DPTR1。这样,通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针。   1 Keil C51对双数据指针的支
[单片机]
<font color='red'>Keil</font> C51中对双数据指针的直接利用

推荐帖子

老外杂志
1People(人物)http://people.aol.com/people/index.html娱乐  2TVGuide(电视指南)http://www.tvguide.com娱乐  3Time(时代)http://www.time.com新闻  4SportsIllustrated(体育画报)http://sportsillustrated.cnn.com体育  5BetterHomes&Gardens(美好家园)htt
mdreamj RF/无线
有关编写嵌入式类似驱动的程序
要为三星的44BoX的板子的usb和串口写不加载os时类似驱动的程序,(相当于提供一些底层硬件的接口)请问应该看哪方面的资料,以前驱动也没写过,能给一个大致的框架。底层的我只懂一点arm汇编,不知道够不够?好像大部分程序用C,嵌一点汇编就可以了。我一点概念也没有,有没有类似的程序可以参考一下?有关编写嵌入式类似驱动的程序首先要熟悉硬件.如果之前没有写过而且没有类似的驱动源码,还是挺困难的。驱动全部用C差不多就能搞定,主要是首先要了解模块,了解驱动,然后还需要了解芯片资料,并在开发板上找到
zhmstone 嵌入式系统
关于GD32F303的IAP程序在keil5下使用CMSIS-DAP烧录后运行不来的问题
以前调试GD32F303都是用ST-LINK的,也能用。今天找不到ST-LINK,找了一个CMSIS-DAP,先下载了boot程序,再下载了应用程序。结果boot能运行,跳到应用程序里面,SystemInit()系统时钟初始化的时候运行了一会儿就卡住了。一开始以为自己程序写错了,后来以为电脑坏了。最后换了st-link,烧同样的程序结果能正常运行。有人遇到过这种情况吗?关于GD32F303的IAP程序在keil5下使用CMSIS-DAP烧录后运行不来的问题读出来试试
吓于侠义 GD32 MCU
Xilinx PCI Express核总线接口Master DMA设计与实现
Xilinx公司Virtex-5/6/7系列FPGA提供了PCIE的IP核,在核中固化了物理层和数据链路层的相关设计,向用户开放事务层接口,在进行PCI-Express相关设计时,用户只需要配置相关参数来完成物理层和数据链路层的设计,从而只专注于事务层设计与开发,缩短了产品的研发周期。DMA采用第一方DMA则完全由接口卡上的逻辑电路来完成,与快取内存结合在一起,提高了数据的存取及传输性能。使用VerilogHDL语言编写,实现了处理器内存与用户逻辑之间数据的高效传输。釆用Xilin
happyeveryday FPGA/CPLD
我买的stm8l discovery为什么配置SPI的时候寄存器内容不变呢?
例程中的测温和测电压都行,GPIO配置也没问题但是,配置SPI的时候,寄存器内容一直是初始值,不管用库函数还是直接写bit都不行,有了解的大侠么?已经把液晶屏拿掉了,也不行。万分感谢!我买的stm8ldiscovery为什么配置SPI的时候寄存器内容不变呢?这个建议你上传,你配置的过程配置的代码在这,我试过GPIO注销掉,也是一样,SPI_Init后,寄存器一点都不变,好像没有配进去。直接写SPI1->CR1=0x02;也不变voidspiInit(void){ S
yubingz stm32/stm8
《Cmake构建实战》第七章之实战演练
#《Cmake构建实战》第七章之实战演练今天为大家分享一下《Cmake构建实战》第七章的学习内容。读了两遍第七章,我感觉内容略多,所以我的分享就以我的实现项目开发的使用视角来分享第七章这些属性与功能应用。本次示例以计算一串字符串的CRC16为示例做讲解。##应用场景1:生成可执行文件这是我们最简单的应用场景了。也是我们最常用的场景之一。我们首先tree一下我们的示例项目文件结构:通过上面的图片我们可以看到在app文件夹里面存放着应用层的.c/.h文件,主要包含main.c和ma
lemonboard 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved