mdk编译器是多少位,MDK中如何查看编译后的16位校验码
来源:整理 编辑:亚灵电子网 2023-11-08 08:55:37
本文目录一览
1,MDK中如何查看编译后的16位校验码

2,RealView MDK 编译不过 无法打开stm32f10xh
去下载一个STM32的库文件,然后在项目里添加即可。如果你有这个文件,记得修改Options选项里的C/C++栏目里的Include Paths修改成库文件的目录。
3,ARM7keil MDK编译为什么执行下面这个函数不能写入到SD卡而
首先,我不知道答案。但是乐意为你分析一下:1确认硬件没有错误。2对于printf()函数,他属于C的库函数,具体说是I/O库的库函数。C标准中规定,printf()函数是可以根据I/O情况,由编译器规定到底负责实现什么功能的。因为c语言的作者(设计C语法规则的人)根本就不知道,你将使用什么样的I/O设备。所以才把这个定义留给了编译器来实现。keil mdk 的编译器将printf()解释执行为串口2。这便是你的程序在屏幕上输出的原因。3解决方法,重新定义printf()函数,或者定义针对SD卡读写的函数来实现你的功能。
4,STM32 M3内核 keil编译器位域定义中在前面的是放在低位的还是高
是最低位, 一般存放数据默认都是字节内低位对齐呀。 就像你定义一个8位数据A,若A取值范围为0~1,那就是A的bit0位可能为0、可能为1,而其他位均固定为0;若A取值范围为0~3,那A的bit0、bit1位是可0、可1,而其他位固定为0不变。。。。。同样道理,在1个字节内的位段,存放占位时也是先低位(bit0),再高位的呀。stm32_flash编程(片内)配置:http://blog.csdn.net/ybhuangfugui/article/details/51599115
5,mdk编译stm32单片机的c语言程序
for(i=4;i<66;i=i+2)//你原来写的是for(i=4;i<66;i+2),i+2是什么意思? //i++是 i = i+1, i+2可不是 i = i+2的意思 if( i==4 ) pjz=sz[4]; pjz=(pjz+sz[i])/2 ;//求上个数与当前数的平均值! }单片机中每个寄存器或者io口都有一个固定的地址,所以无论是gpioa还是什么外设都是以地址的方式存在的,可以向上跟踪来看下头文件对其做了什么处理这个断言宏是用来判断传入的地址是否为gpiox(a...g)基址中的一个,那么只要其类型匹配则即是正确的用法。参考下http://wenku.baidu.com/view/fa323919c5da50e2524d7f6e.html你的“i+2”加完没有保存到i,你加了也没有用啊!u32 sum = 0;for(i=0;i<32;i++) sum += sz[4+2*i];}pjz = sum / 32;
6,请教用MDK编译出现dfaaxf Error L6218E Undefined symbol 问
出现Target not created,原因主要有:1. 编译时出错,语法错误,变量未定义。2. 连接时出错,调用外部函数,而由缺少相应的OBJ文件。3. 其他原因,用Demo版,限制是程序不能大于4K,结果你超过了4k。Target not created:意思就是编译没有成功。这是因为程序中有错误。编译语言:是一种以编译器来实现的编程语言。它不像直译语言一样,由解释器将代码一句一句运行,而是以编译器,先将代码编译为机器码,再加以运行。理论上,任何编程语言都可以是编译式,或直译式的。它们之间的区别,仅与程序的应用有关。【编译程序】:1、词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。2、源程序中的单词符号经扫描器分析,一般产生二元式:单词种别;单词自身的值。单词种别通常用整数编码,如果一个种别只含一个单词符号,那么对这个单词符号,种别编码就完全代表它自身的值了。3、词法分析器一般来说有两种方法构造:手工构造和自动生成。手工构造可使用状态图进行工作,自动生成使用确定的有限自动机来实现。4、编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。5、中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现中间代码,即为中间语言程序,中间语言的复杂性介于源程序语言和机器语言之间。要相信编译结果,对应的变量或函数就是没有定义。我可能对keil进行调错或退出没有保存的原因,只剩下要调用的.h文件,而.c文件不见了。undefined symbol 意思是未定义的符号,符号是指函数或变量.你要检查一下你是否定义了相关两个名称的函数.或者是那两个函数所在的文件没有正确加入到工程当中,有没有放在能正确编译的位置.
7,stm32编译程序的时候出现的问题前提使用库函数编译器MDK
第一步,将一个i/o口配置成中断输入模式。这里需要注意的是,gpio本身是没有中断功能神马的。如果硬要使他产生中断输入方式,就得将相应的端口映射到相应的外部事件上去。而其他外设是有中断功能的,直接使能/失能其中断即可,比如usart,直接开启其发送/接收中断,那么usart也就相应的采取中断方式进行工作了。而这一点,是我开始很疑惑的:为啥gpio口使用中断方式进行工作的时候就必须要映射到外部事件上去,而其他就不呢?百度网友的解惑是:比如usart产生的中断,是没有经过exti,而是直接将中断放入了nvic;但是gpio它作为中断源,是要经过exti的。仔细参看下面两个图,其实就会恍然大悟:这第一步就是作为输入中断源的i/o口的相关配置,例程库函数如下:1 void button_configuration(void)2 3 gpio_inittypedef gpio_initstructure;4 gpio_initstructure.gpio_mode = gpio_mode_ipu;5 gpio_initstructure.gpio_pin = gpio_pin_11 | gpio_pin_12;6 gpio_init(gpiod, &gpio_initstructure);78 rcc_apb2periphclockcmd(rcc_apb2periph_gpiod | rcc_apb2periph_afio,enable);9 gpio_extilineconfig(gpio_portsourcegpiod , gpio_pinsource11);10 gpio_extilineconfig(gpio_portsourcegpiod , gpio_pinsource12);11 }因为我板子上的例程是按键输入中断,所以函数名字就写的按键配置吧;3~5行,就是gpio口的普通配置,学习单片机开天辟地,就先是gpio口,这个没啥稀奇的了,没啥可说的了;我的板子上是pd^11,pd^12两个端口作为中断输入的。8行,注意这个时候,要使能gpio口的复用时钟功能。9~10行,就是将pd^11,pd^12映射到外部事件线上去。在keil中跳转到其函数实现中:1 void gpio_extilineconfig(uint8_t gpio_portsource, uint8_t gpio_pinsource)2 3 uint32_t tmp = 0x00;4 /* check the parameters */5 assert_param(is_gpio_exti_port_source(gpio_portsource));6 assert_param(is_gpio_pin_source(gpio_pinsource));78 tmp = ((uint32_t)0x0f) << (0x04 * (gpio_pinsource & (uint8_t)0x03));9 afio->exticr[gpio_pinsource >> 0x02] &= ~tmp;10 afio->exticr[gpio_pinsource >> 0x02] |= (((uint32_t)gpio_portsource) << (0x04 * (gpio_pinsource & (uint8_t)0x03)));11 }5~6行,用库函数的都知道,就是两个宏定义,起到的作用是对相关的数据神马的进行正确性检查。8行,gpio_pinsource这个是外面button_configuration()调用gpio_extilineconfig()时传的参数。可能都不知道8行这个式子为啥要这么写。先看看我例程中是如何传的参:gpio_extilineconfig(gpio_portsourcegpiod , gpio_pinsource11); 也即是gpio_pinsource <==>gpio_pinsource11;那么gpio_pinsource11是个什么东西呢:官方库已经这样定义了:#define gpio_pinsource11 ((uint8_t)0x0b)如果按照我的例程,8行这个式子中,tmp == 0x0f << (0x04 *(0x0b & 0x03)==>tmp = 0x0f000;先不管这个数字是个啥意思,反正它就是个数字,它其实是为了第9行寄存器的值服务的-->既然如此,如果用寄存器写的话,我可以直接给寄存器某个值,何必要山路十八弯呢?当然,库函数,是有通用性的,就像一个数学公式的作用。9行:afio_exticr:外部事件控制寄存器。在数据手册中显示,有4个,它们分别对应的是各个外部事件exit_x。每个寄存器对应4个外部事件,于是4x4 = 16。,注意数据手册中的编号是从1开始的,而不是0开始的;但是,mdk中是0~3的。于是这里把相关值带进来一看,第九行其实就变成了如下式子: afio->exticr[gpio_pinsource >> 0x02] &= ~tmp; afio->exticr[2] &= ~0xf000;==>afio->exticr[2] &= 0x0fff; 什么意思?不就是将这个寄存器的第12~15清零吗?不就是将数据手册中第afio_exticr3寄存器的12~15清零么?再次注意:该寄存器在mdk中是0~3的,数据手册中的编号是从1开始的,而不是0开始的; 这个样,9行以前的一切的操作,就是为了给该寄存器的某个位进行清零嘛,至于具体清哪一位,还得看你映射到哪一位。 10行:引脚选择了,现在就选择这个引脚是哪个端口的,我的是d端口,那么按照官方对d端口的定义如下: #define gpio_portsourcegpiod ((uint8_t)0x03) afio->exticr[2] |= 0x03 << 12;查看数据手册,恰好是设置成了d口的第11号端子上嘛。 于是第一步总结是: 1.配置对应io口为上(下)拉输入 3 gpio_inittypedef gpio_initstructure; 4 gpio_initstructure.gpio_mode = gpio_mode_ipu; 5 gpio_initstructure.gpio_pin = gpio_pin_11 | gpio_pin_12; 6 gpio_init(gpiod, &gpio_initstructure); 2.使能相应io端口和端口复用时钟 8 rcc_apb2periphclockcmd(rcc_apb2periph_gpiod | rcc_apb2periph_afio,enable); 3.外部事件寄存器相关位清零; 8 tmp = ((uint32_t)0x0f) << (0x04 * (gpio_pinsource & (uint8_t)0x03)); 9 afio->exticr[gpio_pinsource >> 0x02] &= ~tmp; 4.设置输入端子、端口编号 10 afio->exticr[gpio_pinsource >> 0x02] |= (((uint32_t)gpio_portsource) << (0x04 * (gpio_pinsource & (uint8_t)0x03))); 步骤3-4:(库函数) 9 gpio_extilineconfig(gpio_portsourcegpiod , gpio_pinsource11); 10 gpio_extilineconfig(gpio_portsourcegpiod , gpio_pinsource12); 注:一共有a~g个端口嘛,而每个端口上又有n多端子,这个参看gpio那章数据手册。 悟出:库函数确实方便,具有公式效应,但山路十八弯,在这里,该例程中,要实现该功能,用寄存器,就两条语句嘛: 1 afio->exticr[2] &= 0x0fff; 2 afio->exticr[2] |= 0x03 << 12; 1行:12~15清零 2行:0x03:表示是pd端口 ;0x03 << 12:表示在afio_exticr寄存器中的第12位开始写入0x03这个值,而括号中的2,说明是第三个寄存器,这样一组合,恰好就是pd^11了.描述起来一长串,如果看对照个看数据手册的话,就一目了然了。而这里唯一会让人凌乱的是:这个寄存器在数据手册上的编号和mdk中的编号不一致。自己在细读了<>才发现这个问题,开始可是百思不得其解呀。
文章TAG:
mdk编译器是多少位编译 编译器 多少