《STM32入门笔记.pdf》由会员分享,可在线阅读,更多相关《STM32入门笔记.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、undefinedundefined问题:问题:在看完了例程之后,开始编自己的程序。但是对照例程中的 option 设置。将一切都设置好后还是不能够正常运行。出现了以下的问题。声明代码没有错误。ErrorPe020:identifier TIM1 is undefinedChanged settings forces a full rebuild.Building configuration:workstation-DebugUpdating build tree.23file(s)deleted.Updating build tree.main.cstm32f10 x_adc.cstm32f
2、10 x_bkp.cErrorPe020:identifier EXTI is undefinedErrorPe020:identifier EXTI is undefinedErrorPe020:identifier EXTI is undefinedErrorPe020:identifier EXTI is undefined ErrorPe020:identifier EXTI is undefined ErrorPe020:identifier EXTI is undefinedRE:RE:求助求助 STMSTM 工程组建问题工程组建问题在 Mr.Ma 的博客中已经给你回复过了。第一个
3、错误是说 CAN 没有被定义就使用了,其他的也类似,这个要出就会出一大堆,因为有多少文件中用到了就会有多少报错。解决方法就是找到工程文件夹下的 STM32F10 x_CONF.H 这个文件,把相应字符宏定义体前面的注释符号去掉就行。关键字出现“expected a declaration”RESOLVE:注意查看是否有 main 主程序。declaration is incompatible with previous“delay”RESOLVE:声明函数放在主函数之前。assert_failed学习:固件函数库通过检查库函书的输入来实现运行时间错误侦测。通过使用宏 assert_param
4、来实现运行时间检测。所有要求输入参数的函数都使用这个宏。它可以检查输入参数是否在允许的范围之内。注:运行时间检查,即宏 assert_param 应当只在库在 Debug 模式下编译时使用。建议在用户应用代码的开发和调试阶段使用运行时间检查,在最终的代码中去掉它们以改进代码尺寸和速度。如果用户仍然希望在最终的代码中保留这项功能,可以在调用库函数前,重新使用宏 assert_param 来测试输入参数。*/void assert_failed(u8*file,u32 line)/*User can add his own implementation to report the file nam
5、e and line number,ex:printf(Wrong parameters value:file%s on line%drn,file,line)*/*Infinite loop*/while(1)#endifSTM32F103VBSTM32F103VB 开发板的硬件结构开发板的硬件结构LED1LED1LED2LED2LED3LED3LED4LED4LED5LED5LED6LED6LED7LED7LED8LED8PA15PA15PC11PC11PC10PC10PC12PC12PD2PD2PD3PD3PD4PD4PD5PD5K1K1K2K2K3K3K4K4PC8PC8PC7PC7P
6、C6PC6PB15PB15不按键为高电平输入不按键为高电平输入按键为低电平输入按键为低电平输入关于位段:bit_word_adr:字地址bit_band_base:别名区地址的基址bite_offset*32:位段中一位存放别名区中的一字(四字节)内容,故位段中的一字节存放了 32 字节的别名区内容。bit_number*4:别名区中一位存放别名区中的一字(四字节)内容。关于延时变量:循环变量一般不要定义成整型(int),最好定义成无符号变量(unsignedint),因为整型里面有符号位。STM32STM32 入门笔记入门笔记从从 0 0 建立第一个建立第一个 STM32STM32 工程,点
7、亮工程,点亮 LEDLED。硬件方面:在万利的 EK-STM32F 开发板上,与 LED 相连的是 GPIO 的 PC4PC7,高电平点亮。对于单片机很熟的朋友很容易就知道点亮LED 的方法就是通过 PC4PC7 输出高电平。关于这一点没什么好说的。软件方面:开发的模式仍然是,编写代码,编译,链接,通过开发工具烧写到Flash 这样一个步骤。但是如果一上来就使用 ST 提供的库文件,就会把自己搞得头大,看不到本质。1、STM32 的存储器组织STM32 的程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个 4GB 的线性地址空间内。可访问的存储器被分为8 个 512MB 的块。数据字节
8、以小端格式存放在存储器中,也即一个字的最低有效字节被存放在该字的最低地址字节中。片内集成的 Flash、SRAM 被映射到如下图所示的地址空间中。SRAM:最高达 64KB,地址范围 0 x2000 0000 0 x2000 FFFFFLASH:由 3 个部分组成,Main Block,Information Block。其中,Main Block 用于存放用户程序,最高达 512KB,地址范围 0 x0800 0000 0 x807FFFFFInformation Block又包括 System Memory和 Option Bytes两个部分。System Memory地址范围 0 x1F
9、FFF F000 0X1FFFF F7FF 共计 2KB,用于存放通过 UART1 进行 ICP 编程的 BOOTLOADER;Option Bytes包含 16 个字节,用于(还不知道)2、启动(BOOT)配置细心的朋友一定注意到了上图中的0X0000 0000-0X0007 FFFF 这个 512KB 的地址范围了。它用于什么目的呢?它是 STM32 上电后,开始执行代码的地址区域。也就是说,STM32 上电后,是从 0X0000 0000 这个地址开始执行代码的。但是,问题在于,这个地址范围既没有 FLASH 也没有 SRAM 呀,怎么回事呢?原来,STM32 可以通过 BOOT0,BO
10、OT1两个管脚来动态的把上面提到的存储区域映射到0 x0000 0000-0X0007 FFFF这个区域中。这就是说,可以选择从内嵌FLASH、SRAM、内嵌 bootloader 中启动。3、新建 IAR 工程有了上面这些基础知识后,可以开始我们的第一次尝试了。第一步,新建 IAR 工程,(略,我想大家自己摸索一下应该没有什么问题)第二步,设置选项,这一步的目的是告诉IAR 如何编译我们的工程。有以下几个关键点要注意:1)设置 Target,选择 core 为 coretex-m3,小端模式,堆栈 4 字节对齐2)设置 Linker,在 Output 选项卡下选中 C-SPYExtra Ou
11、tput 中,选中 Generate extra output file3)链接脚本,在Linker 的 Config 选项卡下设置使用自己的链接脚本。该文件控制了如何为目标生成符合要求的可执行代码。修改 IAR 的安装目录IAR SystemsEmbedded Workbench 4.0Kickstartarmconfig 下的默认lnkarm.xcl文件如下几个部分:代码段,位于 Flash 区,STM32F103VBT6有 128K,所以改成如下/*/Read-only segments mapped to ROM./*/-DROMSTART=08000/-DROMEND=FFFFF-D
12、ROMSTART=0 x8000000-DROMEND=0 x801FFF中断向量表范围/*/Address range for reset and exception/vectors(INTVEC)./The vector area is 32 bytes,/an additional 32 bytes is allocated for the/constant table used by ldr PC in cstartup.s79./*/-Z(CODE)INTVEC=00-3F-Z(CODE)INTVEC=ROMSTART-ROMEND数据段,位于 SRAM,STM32F103VBT6有
13、 20KB/*/Read/write segments mapped to RAM./*/-DRAMSTART=100000/-DRAMEND=7FFFFF-DRAMSTART=0 x20000000-DRAMEND=0 x20004FFF堆栈和堆设置/*/Stack and heap segments./*/-D_CSTACK_SIZE=2000-D_CSTACK_SIZE=800/-D_SVC_STACK_SIZE=10-D_IRQ_STACK_SIZE=100/-D_HEAP_SIZE=8000-D_HEAP_SIZE=404、编写代码代码的任务是点亮 LED,其方法和单片机类似,方位G
14、PIO 等外设对应的 IO 端口,它们位于 0 x4000 0000-0X5FFF FFFF这个块里,用指向这个地址范围的指针来访问它们。代码如下:#define GPIOC_CRL(*(unsigned int*)(0 x40011000)#define GPIOC_BSRR(*(unsigned int*)(0 x40011010)#define GPIOC_BRR(*(unsigned int*)(0 x40011014)#define RCC_APB2ENR(*(unsigned int*)(0 x40021018)void delay(void)unsigned int i;for(
15、i=0;i 0 xffff;+i);int main(void)/使能 PORTC 时钟RCC_APB2ENR|=(14);/将 GPIOC_CRL 高 16 位都清 0/这样 CNF 为 00,即选择为推挽输出模式GPIOC_CRL&=0 x0000FFFF;/MODE 选择为 11,即 50MHz 输出模式GPIOC_CRL|=0 x33330000;while(1)GPIOC_BRR=(14);/灭 LED5GPIOC_BSRR=(17);/亮 LED2delay();GPIOC_BRR=(17);/灭 LED2GPIOC_BSRR=(16);/亮 LED3delay();GPIOC_BRR=(16);/灭 LED3GPIOC_BSRR=(15);/亮 LED4delay();GPIOC_BRR=(15);/灭 LED4GPIOC_BSRR=(14);/亮 LED5delay();5、编译下载为了下载到开发板,可以使用开发板自带的ST-LINK工具。工程里也需要相应的设置;Debugger 中,选择第三方驱动第三方驱动中设置安装好的ST-LINK驱动。设置好后,Make,Debug,GO 就 OK 了。