iar for stm32 固件库的学习笔记
stm32学习计划
stm32学习计划一、学习目标1.掌握STM32系列单片机的基本原理和应用技术2.了解STM32系列单片机的硬件组成和功能3.掌握STM32系列单片机的编程语言和开发工具4.能够运用STM32系列单片机开发各种应用项目二、学习内容1.STM32系列单片机简介(1)STM32系列单片机的产生和发展(2)STM32系列单片机的特点和优势2.STM32系列单片机的硬件组成和功能(1)STM32系列单片机的引脚和内部结构(2)STM32系列单片机的时钟系统和电源管理(3)STM32系列单片机的外设和接口模块3.STM32系列单片机的编程语言和开发工具(1)C语言在STM32系列单片机的应用(2)Keil、IAR等集成开发环境的使用(3)STM32CubeMX的配置和使用4.STM32系列单片机的应用项目开发(1)LED闪烁项目的实现(2)串口通信项目的实现(3)定时器和中断项目的实现(4)传感器和执行器控制项目的实现三、学习步骤1.了解STM32系列单片机的基本知识(1)阅读相关书籍和资料,了解STM32系列单片机的技术特点和应用领域(2)观看相关视频和教程,了解STM32系列单片机的基本原理和工作方式2.学习STM32系列单片机的硬件组成和功能(1)查阅官方手册和技术文档,了解STM32系列单片机的引脚分配和内部结构(2)模拟连接实际硬件,了解STM32系列单片机的时钟系统和外设接口(3)通过实验和测试,掌握STM32系列单片机的电源管理和外设控制3.掌握STM32系列单片机的编程语言和开发工具(1)学习C语言的基本语法和STM32系列单片机的编程规范(2)安装和配置Keil、IAR等集成开发环境,了解STM32CubeMX的使用方法(3)编写简单的程序和项目,熟悉STM32系列单片机的编程过程和调试方法4.运用STM32系列单片机开发应用项目(1)根据实际需求设计和实现LED闪烁和串口通信项目(2)利用定时器和中断控制STM32系列单片机的各种功能和模块(3)使用传感器和执行器控制外部设备,完成各种应用项目的开发和测试四、学习资源1.书籍和资料(1)《STM32单片机开发指南》(2)《STM32CubeMX软件手册》2.网络教程和视频(1)B站上的STM32系列单片机教学视频(2)网上的STM32系列单片机技术博客和社区论坛3.实验平台和开发工具(1)STM32Discovery和STM32Nucleo等开发板(2)Keil、IAR和STM32CubeMX等集成开发环境五、学习计划目标:掌握STM32系列单片机的基本原理和应用技术内容:学习STM32系列单片机的硬件组成和功能时间:1个月2.第二阶段目标:掌握STM32系列单片机的编程语言和开发工具内容:学习C语言的基本语法和STM32系列单片机的编程规范时间:1个月3.第三阶段目标:能够运用STM32系列单片机开发各种应用项目内容:运用STM32系列单片机开发LED闪烁和串口通信项目时间:1个月4.第四阶段目标:掌握STM32系列单片机的高级应用技术内容:利用定时器和中断控制STM32系列单片机的各种功能时间:1个月六、学习方法1.理论学习和实践探索相结合在学习过程中,要注重理论知识的学习,同时要进行实际操作和项目开发,将理论知识应用到实际项目中去,加深对STM32系列单片机的理解和掌握。
stm32实训报告经验总结
stm32实训报告经验总结STM32实训报告经验总结一、引言在这次STM32实训中,我深入了解了微控制器的基本原理和操作,学会了使用Keil MDK-ARM软件进行编程,掌握了STM32的GPIO、串口、定时器等基本外设的使用。
通过实际操作,我对于嵌入式系统设计和开发有了更深刻的理解。
二、实训过程1. 基础知识学习:首先,我通过阅读教材和网上资料,学习了微控制器的基本概念、STM32的体系结构和外设特性。
我了解到,STM32是一款功能强大的32位ARM Cortex-M核微控制器,具有丰富的外设接口和强大的处理能力。
2. 开发环境搭建:我按照教程安装了Keil MDK-ARM软件,配置了开发环境。
Keil软件提供了完整的开发工具链,包括代码编辑、编译链接、调试和仿真等功能。
3. 硬件平台搭建:我使用STM32开发板搭建了硬件平台。
我熟悉了开发板的电路原理图和引脚配置,了解了各个外设接口的使用方法。
4. 编程实践:在理解了基本概念和操作方法后,我开始进行编程实践。
我编写了GPIO输入输出、串口通信、定时器中断等程序,通过实际操作掌握了STM32的基本外设使用。
5. 调试与优化:在编程过程中,我遇到了许多问题,通过查阅资料和反复调试,最终解决了问题。
我还对程序进行了优化,提高了程序的效率和稳定性。
三、实训收获通过这次实训,我掌握了STM32微控制器的开发流程和基本外设的使用方法。
我学会了使用Keil MDK-ARM软件进行编程和调试,了解了嵌入式系统设计和开发的实际操作过程。
同时,我在实践中遇到了许多问题,通过解决问题,我提高了解决问题的能力。
四、展望未来这次实训让我对嵌入式系统设计和开发有了更深刻的理解。
在未来的学习和工作中,我将继续深入学习嵌入式系统的相关知识,掌握更多的技能和方法。
同时,我将尝试将所学知识应用到实际项目中,提高自己的实践能力和工程经验。
stm32学习经历(5篇可选)
stm32学习经历(5篇可选)第一篇:stm32学习经历随便写写,关于stm32 最近在学习stm32,写点东西,虽然简单,但都是原创啊开发板是前辈画的,好像是用来测试一个3G功能的,不过对于我来说太远;我要来了3个,自己焊了一个最小系统,好在公司资源还是不错的,器件芯片有,还可以问问前辈--对公司还是比较满意的,虽然工资少了点,但学东西第一位O(∩_∩)O~。
最开始当然是建工程了,这个真不太会,前前后后竟用了一周(时间真长,别见笑啊),上网查资料,问前辈,自己琢磨。
总算搞定,然后从GPIO开始学,开始还真没什么头绪(虽然在大学学点51,但完全没有真正应用,顶多是跑马灯实验),开始纠结是从寄存器开始学还是从库函数开始学,后来看到一句“用库函数入门,用寄存器提高”于是下定决心用库,但当时没有库的概念,结果走了很多弯路,看了很多不必要的东西,当时竟没理解到只是调用库就OK了,别的不用管。
最后潜心的在教程网看完一个例程后照猫画虎写了一个,经过了多次调试以后,灯终于亮了!那个兴奋啊。
再次还要感谢希望自己坚持下去,早日能写出一个属于自己的程序,完成一个说的过去的功能,下面把我的程序粘出来,和大家分享下,大虾看到了别见笑啊注:1.有两个灯,PA4 B12,都是低电平点亮2.有两个按键,PB8 和 PB9,按下是低电平3.程序开始后两个灯常亮,按下按键后熄灭,抬起后继续亮main.c中#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_exti.h" void RCC_Configuration(void) //时钟配置函数{ ErrorStatus HSEStartUpStatus; //使能外部晶振RCC_HSEConfig(RCC_HSE_ON); //等待外部晶振稳定HSEStartUpStatus = RCC_WaitForHSEStartUp(); //如果外部晶振启动成功,则进行下一步操作if(HSEStartUpStatus==SUCCESS) { //设置HCLK(AHB时钟)=SYSCLK 将系统时钟进行分频后,作为AHB总线时钟RCC_HCLKConfig(RCC_SYSCLK_Div1); //PCLK1(APB1) = HCLK/2 将HCLK时钟2分频后给低速外部总线RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK2(APB2) = HCLK HCLK时钟配置给高速外部总线 RCC_PCLK2Config(RCC_HCLK_Div1); //外部高速时钟HSE 4倍频RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4); //启动PLL RCC_PLLCmd(ENABLE); //等待PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //系统时钟SYSCLK来自PLL输出RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //切换时钟后等待系统时钟稳定 while(RCC_GetSYSCLKSource()!=0x08); } // 下面这些都是外设总线上所挂的外部设备时钟的配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); }void GPIO_Configuration(void) //GPIO配置函数{ //GPIO_DeInit(GPIOA); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;GPIO_Init(GPIOB,&GPIO_InitStructure); } void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; // 管脚选择GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9); // 清除 EXTI线路挂起位EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9); // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line8|EXTI_Line9; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 注意名称是“_IRQn”,不是“_IRQChannel”NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } int main(void) { RCC_Configuration(); GPIO_Configuration(); EXTI_Config(); NVIC_Config();while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOA,GPIO_Pin_4); } } 中断文件 it.c中void EXTI9_5_IRQHandler(void) { if ( EXTI_GetITStatus(EXTI_Line8) != RESET ) { EXTI_ClearITPendingBit(EXTI_Line8);GPIO_SetBits(GPIOA,GPIO_Pin_4);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0); } if ( EXTI_GetITStatus(EXTI_Line9) != RESET ){ EXTI_ClearITPendingBit(EXTI_Line9);GPIO_SetBits(GPIOB,GPIO_Pin_12);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0);勤劳的蜜蜂有糖吃} }第二篇:STM32入门经历,高手不要进!现在STM32初学入门,写些关于入门的帮助,也算答谢帮助过我的人.希望象我这样想学STM32的朋友不用迷茫.(本入门只适合低手,高手不要见笑).1.硬件平台.现在可以买到学习有的有英蓓特的MCBSTM32 和万利的EK-STM32F,可能目前出来最好的还是的神舟系列开发板,包括神舟I号(103RBT),神舟II号(103VCT),神舟III号(103ZET),神舟iv号(107VCT)几款都有,反正这几个板我都买了,学校出钱买的,还挺实惠,让老板打了个折扣,如果你自己开板做,成本还比这高.学会了才自己做自己的板子吧.2.软件平台.现在流行的有Keil MDK 3.15b和 IAR EWARM 4.42A. 购买评估板时,里面的光盘已经带了.为什么选这两个平台,用的人多,你以后遇到问题,可以找人解决的机会就大.英蓓特的MCBSTM32用的是Keil MDK 平台, 万利的是 IAR EWARM.3.C语言知识如果想补这推荐一本入门的书C Primer Plus 中文版.这本也是入门的好书.4.ST的数据手册STM32F10x参考手册看完这个就对STM32的内部有认识.STM32 Document and library rules 个人认为这个最重要.因为你学会了C语言看例程时.很多如GPIO_SetBits GPIO_ResetBits.很多C语言以外的函数库.这些都是STM32的库文件.5.看例程.如keil MDK 3.15b下的C:/Keil/ARM/Boards/Keil/MCBSTM32 有很多例程.GPIO口,RTC,PWM,USB,CAN等等....你想到的都有例程.6.多上论坛,呵呵.....有不明问下高手,我也是这样.只要不断努力,你一定会成功的.第三篇:STM32学习心得笔记STM32学习心得笔记时钟篇在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
STM32自学笔记
STM32⾃学笔记⼀、原⼦位操作:原⼦位操作定义在⽂件中。
令⼈感到奇怪的是位操作函数是对普通的内存地址进⾏操作的。
原⼦位操作在多数情况下是对⼀个字长的内存访问,因⽽位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。
原⼦操作中的位操作部分函数如下:void set_bit(int nr, void *addr)原⼦设置addr所指的第nr位void clear_bit(int nr, void *addr)原⼦的清空所指对象的第nr位void change_bit(nr, void *addr)原⼦的翻转addr所指的第nr位int test_bit(nr, void *addr)原⼦的返回addr位所指对象nr位inttest_and_set_bit(nr, void *addr)原⼦设置addr所指对象的第nr位,并返回原先的值int test_and_clear_bit(nr, void *addr)原⼦清空addr所指对象的第nr位,并返回原先的值int test_and_change_bit(nr, void *addr)原⼦翻转addr所指对象的第nr位,并返回原先的值unsigned long word = 0;set_bit(0, &word); /*第0位被设置*/set_bit(1, &word); /*第1位被设置*/clear_bit(1, &word); /*第1位被清空*/change_bit(0, &word); /*翻转第0位*/⼆、STM32的GPIO锁定:三、中断挂起:因为某种原因,中断不能马上执⾏,所以“挂起”等待。
⽐如有⾼、低级别的中断同时发⽣,就挂起低级别中断,等⾼级别中断程序执⾏完,在执⾏低级别中断。
四、固⽂件:固件(Firmware)就是写⼊EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。
STM32学习笔记及勘误手册
/******************************************************************* 文件名:书写程序中一些特别需要留意的地方文件编辑人:张恒编辑日期:15/11/23功能:快速查阅巩固知识点*******************************************************************/ 版本说明:v1.0版本:1.开始编辑书写整个文档,开始用的为TXT文档的形式,整理了部分学习到的东西和一些在书写常用程序中容易出错的地方,以及经常忽视细节而导致程序运行失败,是巩固知识点,提醒值得注意地方的工具文档。
2.添加的功能上基本涵盖了所有的模块,除了串口通信中的SPI和I2C、I2S等,应用是比较简单后续可能会添加。
3.对一些特定的功能综合应用并未加入进去,这是一个不好的地方,后续应该会随着学习总结更新,每次更新记录为一个版本。
// 2015/11/24;v1.1版本:1.将所有的TXT版本的文档全部转换为DOC模式,并且更新的加入了目录显示,显示为1级目录,方便查阅相关内容。
2.更新了SysTick书写中值得注意的地方3.更新了FSMC的一些细微操作,后续继续追捕更新书写细节。
V1.2版本:1.更新了FSMC部分功能显示,详细了FSMC的使用注意事项2.添加了RTC实时时钟的一些注意事项。
//2015/12/1;V1.3版本:1.更新RTC部分注意事项。
//2015/12/11V1.4版本:1.更新ADC校准标志部分注意事项。
2.更新了TIM1和TIM8的高级定时器特殊功能说明。
//2015/12/13V1.5版本:1.优化了部分注意事项,SysTick的写法上重新的定制写法。
2.优化了ADC在使用过程的一些细节注意地方。
3.面对最近出现的浮点数运算错误,配合AD数据进行总结。
4.RTC细节的把握-配置正确顺序的错误。
stm32自学笔记共20页
•
LED0=1;
•
LED1=0;
•
delay_ms(300);
•
}
•}
第二章 跑马灯实验
• Led.c函数
• void LED_Init(void)
•{
•
RCC->APB2ENR|=1<<2; //使能PORTA时钟
•
GPIOA->CRH|=0XFFFFFFFF3;//PA8 推挽输出
•
GPIOA->ODR|=1<<8; //PA8 输出高
• JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD,在原理图上可以看 到PA13和PA15为键盘和JTAG与SWD所共用,而这两种方针接口,他们 和普通的IO口公用,当想使用普通IO口时,必须先把他们关闭。在这 个函数里面设置参数,如果为二进制数00,则代表全部使能,如果是 二进制数01,则是能SWD,如果是10,则表示全部关闭。JTAG是一种 国际标准测试协议,主要用于芯片内部的测试。
• }要想实现一个点亮led小灯的功能,最少只需对3个寄存器进行设 置,第一步是设置外设时钟使能先把PORTA时钟使能,接下来把IO
口设置为输出,在接下来设置输出为高电平还是低电平,这里使用 推挽输出(3.3v),推挽输出主要是增强驱动能力,为外部提供大电 流。
第二章 跑马灯实验
• #ifndef __LED_H • #define __LED_H • #include "sys.h" • #define LED0 PAout(8)// PA8 • #define LED1 PDout(2)// PD2 • void LED_Init(void);//初始化
STM32学习笔记-STM32F103ZET6
STM32F103 系列芯片的系统架构:系统结构:在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。
GPIO 输入输出,外部中断,定时器,串口。
理解了这四个外设,基本就入门了一款MCU。
时钟控制RCC:-4~16M 的外部高速晶振-内部8MHz 的高速RC 振荡器-内部40KHz低速RC 振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到- 外部低速32.768K 的晶振,主要做RTC 时钟源ARM存储器映像:数据字节以小端格式存放在存储器中。
一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
存储器映像与寄存器映射:ARM 存储器映像4GB0X0000 00000X1FFF FFFF0X2000 00000X3FFF FFFF0X4000 00000X5FFF FFFF寄存器名称相对外设基地址的偏移值编号位表读写权限寄存器位功能说明使用C语言封装寄存器:1、总线和外设基地址封装利用地址偏移(1)定义外设基地址(Block2 首地址)(2)定义APB2总线基地址(相对外设基地址偏移固定)(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写//定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义APB2 总线基地址#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2)//定义GPIOC 外设基地址#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3)//定义寄存器基地址这里以GPIOC 为例#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4)#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)//控制GPIOC 第0 管脚输出一个低电平5)GPIOC_BSRR = (0x01<<(16+0));//控制GPIOC 第0 管脚输出一个高电平GPIOC_BSRR = (0x01<<0);2、寄存器封装利用结构体、外设基地址和寄存器地址偏移typedef unsigned int uint32_t; /*无符号32 位变量*/typedef unsigned short int uint16_t; /*无符号16 位变量*//* GPIO 寄存器列表*/typedef struct{uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */}GPIO_TypeDef;只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。
STM32f103C8T6入门学习记录
STM32自学笔记作者:忙碌的小姚新浪微博:@忙碌的小姚新浪博客:/mlxiaoyao222目录STM32 自学笔记 (1)第一章 (3)我与STM32 的那些日子 (3)第二章 (4)使用固件库建立一个工程 (4)1、了解STM32F103的固件库 (4)2、创建第一个工程 (4)3、接下来就是管理工程文件了 (9)4、编写main.c 和文件路径 (10)第三章 (14)STM32点亮第一个LED 使用keil for ARM MDK 软件仿真 (14)1、Main.c 函数代码: (14)2、代码分析: (15)3、软件仿真介绍: (16)第四章 (19)串口的使用 (19)1、为什么要用串口? (19)2、STM32跟PC机(也就是电脑)如何连接 (19)3、代码分析 (20)4、仿真及调试 (23)5、串口接收数据 (25)第五章 (27)通用定时器的使用 (27)1、STM32F103内部定时器有哪些? (27)2、如何进行程序编写 (27)3仿真结果观察 (30)4对第四章串口的补充 (31)5工程代码 (35)第一章我与STM32 的那些日子STM32这块板子是在阿莫上跟一个老师买的,砍了半天100块钱。
包括一个Jlink v8仿真器(好像65块左右),和一块STM32系统板。
那已是一年前的事了。
那时我刚大三,刚学了半年51,于是想学点更高级的。
但我好像属于三分钟热度的这种人,买回来学了一个星期,就学不动了,寄存器操作,固件库的使用根本就没明白是怎么一回事,之后就没有然后了。
现在看到那块板子,总有一种说不出的滋味,要是当时能咬牙切齿努力学习,说不定现在也不会安静地坐在电脑前一字一句敲打这篇激励性文章了。
对于STM32我没用任何基础,唯一有的也只是一年前学的那一个星期,不过那已不重要了,我现在仍是一个小白。
作为一个初学者,也许是坐井观天,看的是片面的,可能有很多观点是错误的,希望读者朋友能勇于指出来。
IAR_for_stm32_新建工程点亮LED[技巧]
IAR for arm 4.42A 应用笔记学习stm32我选择的用的编译器IAR for arm 4.42A,因为开始用的这个吧,习惯了,我感觉,用什么编译器,都一样,程序还是要自己写的,别的东西永远是别人的,拿到自己手里,才是自己的;用IAR调stm32,我首先想到的是用stm32f103驱动一个LED,让他亮起来;接着调中断,接着调各种总线(SPI、SDIO、FSMC、UART、CAN、USB),这些会了,估计什么外围器件都能接上了。
第一章建工程点亮LED1.建工程:这里说下我怎样建的工程:点击如果错过了这个界面点Project——Creat New Project…点,取个名字就可以保存了;有了新的工程点下,保存为.C 文件;再在工程上右击——Add——Add Files..;把我们.C文件加进去;下面是最重要的一部,配置Option;右击工程,点出Option 界面;这里主要配置的几项有://General Options;//C/C++Compiler;//Linker;//Debugger;(1)Option 中的Target 选择我们所用的芯片型号;(2)C/C++Compiler中的Preprocessor输入我们的.h 文件的路径;说明:$PROJ_DIR$\带表的工程序所在的目录;在这个位置的基础上来添加我们的目录。
如:我们在E盘下建了一个文件夹(My_Project)放我们的工程;我把点.h文件放在E:\My_Project \User\inc里面,我们就可以把目录写成$PROJ_DIR$\user\inc;这样方便我的工程随便移动位置;(3)Linker下的Output设置如下:Extra Output设置如下:Config设置如下:说明:这个xcl是我们的flash配置文件,IAR4.42用的xcl文件,高版本的IAR已改为.icf文件,作用是一样的,加载进去就行;(4)Debugger中的Setup先择所用的调试工具,选上run to main;Download中有一项。
STM32 固件库的使用
2012-03-14 10:40iar for stm32 固件库的学习笔记系统、源程序文件和头文件命名都以“stm32f10x-”作为开头寄存器作为常量处理外设函数的命名以外设的缩写加下划线开头每个单词的开头字母大写每个函数名只有一个下划线分隔外设缩写和函数名的其他部分ppp_Init :::根据PPP_InitTypeDef中指定的参数,初始化外设PPP。
PPP_DeInit::::复位外设PPP的所有寄存器至缺省值PPP_StructInit :::其功能为通过设置PPP_InitTypeDef结构中的各种参数来定义外设的功能PPP_Cmd:::使能或失能外设PPPPPP_ITConfig:::为使能或者失能来自外设PPP某中断源PPP_DMAConfig:::失能或者使能外设PPP的DMA接口用以配置外设功能的函数总是以字符串“Config”结尾PPP_GetFlagStatus:::检查外设PPP某标志位被设置与否PPP_ClearFlag:::清楚外设PPP标志位PPP_GetITStatus:::判断来自外设PPP的中断发生与否PPP_ClearITPendingBit:::清除外设PPP中断待处理标志位typedef signed long s32;typedef signed short s16;typedef signed char s8;typedef signed long const sc32; /* Read Only */typedef signed short const sc16; /* Read Only */typedef signed char const sc8; /* Read Only */typedef volatile signed long vs32;typedef volatile signed short vs16;typedef volatile signed char vs8;typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long const uc32; /* Read Only */typedef unsigned short const uc16; /* Read Only */typedef unsigned char const uc8; /* Read Only */typedef volatile unsigned long vu32;typedef volatile unsigned short vu16;typedef volatile unsigned char vu8;typedef volatile unsigned long const vuc32; /* Read Only */ typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */stm32f10x_type.h文件中布尔型变量typedef enum{FALSE = 0,TRUE = !FALSE} bool;标志位状态类型 SET & RESETtypedef enum{RESET = 0,SET = !RESET} FlagStatus;功能状态类型 ENABLE&DISABLEtypedef enum{DISABLE = 0,ENABLE = !DISABLE} FunctionalState;错误状态类型 SUCCESS or ERRORtypedef enum{ERROR = 0,SUCCESS = !ERROR} ErrorStatus;stm32f10x_map.h文件包含了所有外设控制寄存器的结构,下例为SPI寄存器结构的声明:/*------------------ Serial Peripheral Interface ----------------*/ typedef struct{vu16 CR1;u16 RESERVED0;vu16 CR2;u16 RESERVED1;vu16 SR;u16 RESERVED2;vu16 DR;u16 RESERVED3;vu16 CRCPR;u16 RESERVED4;vu16 RXCRCR;u16 RESERVED5;vu16 TXCRCR;u16 RESERVED6;} SPI_TypeDef;RESERVEDi(i为一个整数索引值)表示被保留区域stm32f10x_map.h函数包含了所有的外设声明,下例为spi外设的声明:#ifndef EXT#Define EXT extern#endif...#define PERIPH_BASE ((u32)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000).../* SPI2 Base Address definition*/#define SPI2_BASE (APB1PERIPH_BASE + 0x3800).../* SPI2 peripheral declaration*/#ifndef DEBUG...#ifdef _SPI2#define SPI2 ((SPI_TypeDef *) SPI2_BASE)#endif /*_SPI2 */...#else /* DEBUG */...#ifdef _SPI2EXT SPI_TypeDef *SPI2;#endif /*_SPI2 */...#endif /* DEBUG */如果用户希望使用外设SPI,那么必须在文件STM32f10x_conf.h中定义_SPI标签例如:#define _SPI#define _SPI1#define _SPI2每个外设都有若干寄存器专门分配给标志位。
STM32F4学习笔记之GPIO(使用固件库)
1.使能GPIO的AHB时钟,使用函数:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);2.配置GPIO工作模式用GPIO_Init()函数数据类型说明typedef struct{uint32_t GPIO_Pin; //引脚配置GPIOMode_TypeDef GPIO_Mode; //GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF (备用),GPIO_Mode_AN(模拟)GPIOSpeed_TypeDef GPIO_Speed;// GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHzGPIOOType_TypeDef GPIO_OType; // GPIO_OType_PP(推挽),GPIO_OType_OD(开漏)GPIOPuPd_TypeDef GPIO_PuPd; GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)}GPIO_InitTypeDef;3.备用功能配置(除ADC和DAC外的所有非GPIO功能),使用函数void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)* This GPIO_AF can be one of the following values:* @arg GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin to AF0 (default after reset)* @arg GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2) to AF0 (default after reset)* @arg GPIO_AF_TAMPER: Connect TAMPER pins (TAMPER_1 and TAMPER_2) to AF0 (default after reset)* @arg GPIO_AF_SWJ: Connect SWJ pins (SWD and JTAG)to AF0 (default after reset)* @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset)* @arg GPIO_AF_TIM1: Connect TIM1 pins to AF1* @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1* @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2* @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2* @arg GPIO_AF_TIM5: Connect TIM5 pins to AF2* @arg GPIO_AF_TIM8: Connect TIM8 pins to AF3* @arg GPIO_AF_TIM9: Connect TIM9 pins to AF3* @arg GPIO_AF_TIM10: Connect TIM10 pins to AF3* @arg GPIO_AF_TIM11: Connect TIM11 pins to AF3* @arg GPIO_AF_I2C1: Connect I2C1 pins to AF4* @arg GPIO_AF_I2C2: Connect I2C2 pins to AF4* @arg GPIO_AF_I2C3: Connect I2C3 pins to AF4* @arg GPIO_AF_SPI1: Connect SPI1 pins to AF5* @arg GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5* @arg GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6* @arg GPIO_AF_I2S3ext: Connect I2S3ext pins to AF7* @arg GPIO_AF_USART1: Connect USART1 pins to AF7* @arg GPIO_AF_USART2: Connect USART2 pins to AF7* @arg GPIO_AF_USART3: Connect USART3 pins to AF7* @arg GPIO_AF_UART4: Connect UART4 pins to AF8* @arg GPIO_AF_UART5: Connect UART5 pins to AF8* @arg GPIO_AF_USART6: Connect USART6 pins to AF8* @arg GPIO_AF_CAN1: Connect CAN1 pins to AF9* @arg GPIO_AF_CAN2: Connect CAN2 pins to AF9* @arg GPIO_AF_TIM12: Connect TIM12 pins to AF9* @arg GPIO_AF_TIM13: Connect TIM13 pins to AF9* @arg GPIO_AF_TIM14: Connect TIM14 pins to AF9* @arg GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10* @arg GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10* @arg GPIO_AF_ETH: Connect ETHERNET pins to AF11* @arg GPIO_AF_FSMC: Connect FSMC pins to AF12* @arg GPIO_AF_OTG_HS_FS: Connect OTG HS (configured in FS) pins to AF12* @arg GPIO_AF_SDIO: Connect SDIO pins to AF12* @arg GPIO_AF_DCMI: Connect DCMI pins to AF13* @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF154.使用GPIO_ReadInputData(GPIO_TypeDef* GPIOx)和GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读输入信号5.使用GPIO_SetBits()/GPIO_ResetBits()设置输出引脚6.上电或复位后,引脚备用功能都没启用(JTAG引脚除外),为悬浮输入状态7.LSE引脚OSC32_IN 和OSC32_OUT(PC14 and PC15)的优先级高于GPIO8.HSE引脚OSC_IN/OSC_OUT (PH0 / PH1)的优先级高于GPIO例程:int main(void){GPIO_InitTypeDef GPIO_InitStructure;/* GPIOG Periph clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_12);GPIO_ResetBits(GPIOD, GPIO_Pin_13);while (1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){GPIO_SetBits(GPIOD, GPIO_Pin_13);GPIO_ResetBits(GPIOD, GPIO_Pin_12);}else{GPIO_SetBits(GPIOD, GPIO_Pin_12); GPIO_ResetBits(GPIOD, GPIO_Pin_13);}}}。
IAR下用JLINK调试STM32心得
IAR下用JLINK调试STM32心得IAR开发环境下使用JLINK来调试STM32芯片是一种常见的调试方法。
以下是我在实际使用中总结的一些经验和心得。
首先,在使用JLINK进行调试之前,我们需要按照JLINK提供的说明书正确连接好硬件设备。
通常,我们需要将JLINK与STM32芯片之间连接好,并确保连接的正确性。
此外,我们还需将JTAG/SWD接口正确地连接到STM32的相应引脚上。
接下来,在IAR环境下进行配置。
在打开IAR工程之前,我们需要确保IAR和JLINK驱动软件已经正确地安装到电脑上。
然后,我们可以打开IAR并打开相关的工程文件,然后进入调试模式。
在调试模式下,我们需要在IAR的"Options"菜单中选择"Debugger"选项。
在"Driver"栏中,我们需要选择使用JLINK进行调试。
在"Setup"选项卡下,我们可以进一步配置JLINK的一些参数,比如连接速度和复位方式等。
根据实际需求,我们可以对这些参数进行相应的调整。
在调试过程中,我们可以使用IAR提供的各种调试工具来观察和分析程序的运行状态。
比如,我们可以使用"Watch"窗口来监视变量的值,或者使用"Memory"窗口来查看内存的内容等。
此外,我们还可以使用"Breakpoints"来设置断点,使程序在特定的位置停止执行,方便我们进行代码的调试和分析。
从实践中,我发现在使用JLINK调试STM32时,一些常见的问题可能会出现。
比如,由于硬件连接出错或者参数配置不当,导致与JLINK的连接失败。
此时,我们需要仔细检查硬件连接,并重新配置JLINK的参数。
另外,有时候程序可能会卡死或者出现异常,导致调试失败。
这时,我们可以使用IAR提供的复位工具来重新启动STM32芯片,然后重新开始调试。
IAR 6.2 for STM32注意点
CMSIS build problems with IAR EmbeddedWorkbench ver. 6.20f you use IAR release 6.20 and STM Library 3.5 you probably have a lot of errors (see below).......................Error[Og006]: Syntax error in inline assembly: "Error[446]: The selected cpu/core does not support this status register" C:\TraningSTM-Castelletto-F200-052011\Copia\Examples\LABS\Libraries\CMSIS\CM3\CoreS upport\core_cm3.c 268Error[Og006]: Syntax error in inline assembly: "Error[438]: This instruction is not available in the selected cpu/core" C:\TraningSTM-Castelletto-F200-052011\Copia\Examples\LABS\Libraries\CMSIS\CM3\CoreS upport\core_cm3.c 324Error[Pe147]: declaration is incompatible with "__thumb __softfp unsigned long __REV16(unsigned long)" (declared at line 173 of "C:\Program Files\IAR C:\TraningSTM-Castelletto-F200-052011\Copia\Examples\LABS\Libraries\CMSIS\ CM3\CoreSupport\core_cm3.h 1124Systems\Embedded Workbench 6.0 Kickstart_2\arm\inc\c\intrinsics.h")Error[Pe147]: declaration is incompatible with "__thumb __softfp unsigned long __RBIT(unsigned long)" (declared at line 174 of "C:\Program Files\IAR C:\TraningSTM-Castelletto-F200-052011\Copia\Examples\LABS\Libraries\CMSIS\ CM3\CoreSupport\core_cm3.h 1134Systems\Embedded Workbench 6.0 Kickstart_2\arm\inc\c\intrinsics.h")Error[Pe147]: declaration is incompatible with "__thumb __softfp unsigned long __REV16(unsigned long)" (declared at line 173 of "C:\Program Files\IAR C:\TraningSTM-Castelletto-F200-052011\Copia\Examples\LABS\Libraries\CMSIS\ CM3\CoreSupport\core_cm3.h 1124This is caused to the fact that IAR now incorporate CMSIS files that are also inside the STM Library.This problem is known and the IAR solution is here(html page) or here(pdf).My solution is: commenting the line 93 in the file core_cm3.c, see below.。
单片机STM32学习笔记
推挽输出与开漏输出的区别推挽输出推挽输出::可以输出高可以输出高,,低电平低电平,,连接数字器件连接数字器件; ;开漏输出开漏输出::输出端相当于三极管的集电极输出端相当于三极管的集电极. . 要得到高电平状态需要上拉电阻才行要得到高电平状态需要上拉电阻才行. . 适合于做电流型的驱动电流型的驱动,,其吸收电流的能力相对强其吸收电流的能力相对强((一般20ma 以内以内). ).推挽结构一般是指两个三极管分别受两互补信号的控制推挽结构一般是指两个三极管分别受两互补信号的控制,,总是在一个三极管导通的时候另一个截止另一个截止. .要实现“线与”需要用OC(open collector)collector)门电路门电路门电路..是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中以推挽方式存在于电路中,,各负责正负半周的波形放大任务各负责正负半周的波形放大任务,,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小关管每次只有一个导通,所以导通损耗小,,效率高。
输出既可以向负载灌电流,也可以从负载抽取电流。
抽取电流。
问题:问题:很多芯片的供电电压不一样,有3.3v 和5.0v 5.0v,需要把几种,需要把几种IC 的不同口连接在一起,是不是直接连接就可以了?实际上系统是应用在I2C 上面。
上面。
简答:简答:1、部分3.3V 器件有5V 兼容性,可以利用这种容性直接连接兼容性,可以利用这种容性直接连接2、应用电压转换器件,如TPS76733就是5V 输入,转换成3.3V 3.3V、、1A 输出。
输出。
开漏电路特点及应用在电路设计时我们常常遇到开漏(在电路设计时我们常常遇到开漏(open drain open drain )和开集()和开集()和开集(open collector open collector )的概念。
所)的概念。
所谓开漏电路概念中提到的“漏”就是指MOSFET 的漏极。
STM32实现IAP功能的学习笔记--转载
STM32实现IAP功能的学习笔记--转载STM32实现IAP功能的学习笔记最近因项⽬需求要实现STM32的在线升级即IAP功能,先将这⼏天的学习体会和IAP的具体实现总结出来,分享给⼤家,希望对同样实现IAP 的童鞋有所帮助,⽂中最后会上传名为STM32_Update.zip的压缩⽂件⾥⾯包含了STM32_App、STM32_MyBoot_V1.0和升级软件STM32_UpdateSoftware的源码⽂件供⼤家参考。
所有程序都经过测试,可以直接在原⼦哥的上跑,上位机的升级软件⼤家可以直接打开STM32_Update\STM32_UpdateSoftware\Release\STM32_UpdateSoftware.exe来升级,如果需要查看源码请⽤VS2010打开⼯程⽂件。
最终要实现的是:单⽚机每次上电会先运⾏Boot程序,检查标志位如果标志位为FLAG_TO_APP则直接跳转到App程序运⾏,如果标志位为FLAG_TO_BOOT,则运⾏Boot程序准备升级。
在运⾏App程序时,当接收到升级的指令后会在FLASH中的某处空间写下升级的标志位FLAG_TO_BOOT,并且加载Boot程序,Boot程序会接受新的程序⽂件并且存储在相应的FLASH空间⾥,完成升级后会在标志位的空间写下FLAG_TO_APP,并且运⾏新的程序。
帖⼦包含如下⼏个⽅⾯:1. 什么是IAP?2. STM32的启动模式?3. STM32的FLASH分布?4. STM32程序的运⾏过程?5. BootLoader程序的编写(如何实现程序的动态加载)?6. App程序的编写?7. bin⽂件的转换?8. 上位机串⼝升级软件的简介-------------------------------------------------------------------------------------------------1. 什么是IAP?IAP的知识⽹上的各种资料也说的⽐较明⽩,在此简单介绍⼀下。
STM32单片机的知识点总结
STM32系统结构STM32f10xxx系统结构内核IP从结构框图上看,Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:指令存储区总线(两条)、系统总线、私有外设总线。
有两条代码存储区总线负责对代码存储区(即 FLASH 外设)的访问,分别是 I-Code 总线和 D-Code 总线。
I-Code用于取指,D-Code用于查表等操作,它们按最佳执行速度进行优化。
系统总线(System)用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。
私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。
它们也在系统级存储区。
还有一个DMA总线,从字面上看,DMA是data memory access的意思,是一种连接内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。
简而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工。
处理器外设(内核之外的外设)从结构框图上看,STM32的外设有串口、定时器、IO口、FSMC、SDIO、SPI、I2C等,这些外设按照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。
寄存器什么是寄存器?寄存器是内置于各个IP外设中,是一种用于配置外设功能的存储器,并且有想对应的地址。
一切库的封装始于映射。
是不是看的眼都花了,如果进行寄存器开发,就需要怼地址以及对寄存器进行字节赋值,不仅效率低而且容易出错。
库的存在就是为了解决这类问题,将代码语义化。
语义化思想不仅仅是嵌入式有的,前端代码也在追求语义特性。
从点灯开始学习STM32内核库文件分析cor_cm3.h这个头文件实现了:1、内核结构体寄存器定义。
2、内核寄存器内存映射。
3、内存寄存器位定义。
跟处理器相关的头文件stm32f10x.h实现的功能一样,一个是针对内核的寄存器,一个是针对内核之外,即处理器的寄存器。
STM32_深入浅出(新手必看)
STM32学前班教程之一:为什么是它经过几天的学习,基本掌握了STM32的调试环境和一些基本知识。
想拿出来与大家共享,笨教程本着最大限度简化删减STM32入门的过程的思想,会把我的整个入门前的工作推荐给大家。
就算是给网上的众多教程、笔记的一种补充吧,所以叫学前班教程。
其中涉及产品一律隐去来源和品牌,以防广告之嫌。
全部汉字内容为个人笔记。
所有相关参考资料也全部列出。
:lol教程会分几篇,因为太长啦。
今天先来说说为什么是它——我选择STM32的原因。
我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。
里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。
不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。
下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和1.9V的电源让人很头疼。
后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的AVR和51都进行了大致的比较,这个时候发现了CortexM3的STM32,比2148拥有更丰富和灵活的外设,性能几乎是2148两倍(按照MIPS值计算)。
正好2148我还没上手,就直接转了这款STM32F103。
与2811相比较(核心1.8V供电情况下),135MHz×1MIPS。
现在用STM32F103,72MHz×1.25MIPS,性能是DSP的66%,STM32F103R型(64管脚)芯片面积只有2811的51%,STM32F103C型(48管脚)面积是2811的25%,最大功耗是DSP的20%,单片价格是DSP的30%。
stm32学习心得体会
stm32学习⼼得体会 stm32作为现在嵌⼊式物联⽹单⽚机⾏业中经常要⽤多的技术,相信⼤家都有所接触,今天这篇就给⼤家详细的分析下有关于stm32的出⼝,还不是很清楚的朋友要注意看看了哦,在最后还会为⼤家分享有些关于stm32的视频资料便于学习参考。
什么是串⼝ UART : Universal Asynchronous Receiver/Transmitter 通⽤异步收发器 USART : Universal Synchronous Asynchronous Receiver/Transmitter 通⽤同步/异步收发器 ⼀种是常⽤也是最简单的串⾏数据传输协议。
数据线只需要两根就可以实现全双⼯。
Tx: 发送数据线 Rx: 接收数据线 A B TX -----------> Rx Rx <------------Tx 全双⼯: 两个设备可以同时发送和接收 串⾏数据: 发送只⼀根线,⼀次只能发送⼀bit. ⼀bit接着⼀bit发送和接收。
模块通信: 上位机 下位机 通信⼀般需要两个设备,我们把这两个设备,⼈为叫做上位机, 下位机。
上位机: 把处理性能强的机⼦,上位机。
数据⼤部分处理都在上位机完成。
下位机: 把数据采集的终端,处理性能单⼀的机⼦,下位机。
串⼝只有⼀根发送数据线,假如 A要发送⼀个字符数据 10101010 给B A -------- --------- -------- ------- ... ⾼电平周期是多长?即使是不发送数据Tx线上也有⼀个电平状态,接收⽅ 它怎么知道你是在发送呢?.... UART数据如何传输? UART protocol 串⼝协议。
串⼝发送和接收数据是以帧为单位. Frame 1帧(Frame)= 1 start bit(起始位) + 5-9bits数据位 + 0/1bit 校验位 + stop bits(0.5, 1,1,5,2) 起始位: ⼀个周期的低电平 数据位: 5-9bits数据位,具体是多少bits,需要双⽅协商。
如何在IAREWARM下建立工程和配置STM32开发环境
如何在IAREWARM下建⽴⼯程和配置STM32开发环境本⽂说明如何在Windows XP操作系统上,使⽤IAR Embedded Workbench for ARM 5.30建⽴⼀个IAR项⽬,并且配置STM32开发环境。
⼀、⽣成⼀个新项⽬要使⽤IAR进⾏STM32嵌⼊式系统开发,必须从建⽴⼀个项⽬(project)开始,下⾯以在E:\下建⽴⼀个名为Example的项⽬为例介绍。
1. 创建项⽬⽬录、复制公共⽂件(1)在E盘下创建名为的Example⽂件夹,即项⽬根⽬录为E:\Example。
(2)在项⽬根⽬录下建⽴⼀个EWARMv5⽂件夹⽤于存放项⽬⽂件、⼯作空间⽂件和项⽬配置相关⽂件。
(3)解压标准外设驱动⽂件库(stm32f10x_stdperiph_lib_V3.1.2.zip),将其中的“Libraries”⽂件夹复制到Example⽬录下。
(4)复制标准外设驱动库⽬录Project\Template下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个⽂件到Example ⽂件夹下。
main.c可以不⽤复制,我们⾃⼰写。
复制标准外设驱动库⽬录Project\Template\EWARMv5下的stm32f10x_flash.i cf、stm32f10x_flash_extsram.icf、stm32f10x_nor.icf和stm32f10x_ram.icf到Examp le\EWARMv5⽂件夹下。
复制好的⽬录如图1所⽰。
图1. Example⽂件夹下的⽂件2. 创建新的⼯作空间嵌⼊式系统开发⼤都是⾯向项⽬(Project)的,需要建⽴Project来管理项⽬开发。
IAR EWRAM⼜是基于⼯作空间(Workspace)的集成开发环境,Project必须放在⼯作空间⾥⾯,所以我们⾸先应该建⽴⼯作空间。
⼀个⼯作空间⾥⾯可以放多个项⽬。
开始→程序→IAR Systems→IAR Embedded Workbench,进⼊IDE环境。
IAR下用JLINK 调试STM32心得
用JLINK V6 调试STM32的教程相关配置:开发板用的是万利的STM3210B-LK1JLINK用的是出品的全功能JLINK V6.0编译调试环境为:IAR EWARM 4.42AJLINK 驱动用的是3.86g下载地址:/product/jlink/Setup_JLinkARM_V386g.zip针STM3210B-LK1评估板需要改动或设置的地方有3点:第一:STM3210B-LK1评估板的BOOT0及BOOT1跳线请跳到0位置.第二:STM3210B-LK1评估板上的JTAG接口的第1,2脚请接上3.3V(手工飞线)。
第三:JLINK 用SWD方式调试此款板子时,需要把板子上的R4,R5断开(因其板子上有STLINK II)否则调试不成功哟目录一设置仿真器类型----JLINK或JTRACE二 JLINK仿真器相关设置三 JTAG/SWD 两种方式的调试一设置仿真器类型----JLINK或JTRACE安装好Manley板子的例程用LCD DemoD:\Manley\EKBoard\EKSTM32F\LCDDemo(lcd+led+buttom)\LCDDemo\project\EWARM菜单:Project->optionsProject->options ->Debugger->Setup->Driver 选JLINKProject->options ->Debugger->Download 二 JLINK仿真器相关设置下面的设置可以用默认:设置完OPTIONS点OK退出设置。
重新编译工程:接下来进入仿真试试。
一般万利的板子用的是STLINK II,以前的FLASH LOADER要重新设置,否则有可能下载不成功。
原因是flash loader的问题。
删除:新建后,点OK退出即可。
进入仿真器设了5个断点分别全速运行到断点处。
注:CORTEX M3只支持6个硬件断点,三 JTAG/SWD 两种方式的调试JTAG方式:用SWD方式调试STM32设置SWD方式Project->options ->J-Link/J-Trace->connection->interface 中选择SWD。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以初始化 DEBUG 模式与文件 stm32f10x_lib.c 中如下:
#ifdef DEBUG void debug(void) { ... #ifdef _SPI2 SPI2 = (SPI_TypeDef *) SPI2_BASE; #endif /*_SPI2 */ ... } #endif /* DEBUG*/
stm32f10x_ppp.c 包含了所有 PPP 需要的固件函数 stm32f10x_map.h 存储器映像文件,包含了所有寄存器的声明,可用于 Debug 和 release 模式
stm32f10x_lib.h 包含所有外设头文件的头文件。他是唯一一个用户需要包括 在自己应用中的文件,起到应用和库之间界面的作用。
typedef enum { DISABLE = 0, ENABLE = !DISABLE } FunctionalState;
错误状态类型 SUCCESS or ERROR
typedef enum { ERROR = 0, SUCCESS = !ERROR } ErrorStatus;
stm32f10x_map.h 文件包含了所有外设控制寄存器的结构,下例为 SPI 寄存器结 构的声明:
stm32f10x_conf.h 是唯一一个需要用户修改的文件。他作为应用和库之间的 连接界面指定了一系列的参数
外设的初始化和设置
1:在主应用文Leabharlann 中,声明一个结构 PPP_InitTypeDef,例如:
PPP_InitTypeDef PPP_InitStructure;
这里 PPP_InitStructure 是一个位于内存中的工作变量,用来初始化一个或者多 个外设 PPP
子文件夹 src 包含了固件函数库所需要的源文件,用户无需修改该文件夹:
stm32f10x_ppp.c :每个外设对应一个源文件,高喊了该外设使用的函数体 stm32f10x_lib.c :初始化所有外设的指针
文件夹 Project
高喊了一个标准的程序项目模板,包括库文件的编译和所有用户可以修改的文 件,可用以建立新的工程
readme.txt :每个例子的简单描述和使用说明。 stm32f10x_conf.h:该头文件设置了所有使用到的外设,有不同的 DEFINE 语句 组成。 stm32f10x_it.c :该头文件包含了所有的终端处理程序,如果未使用中断,则 所有的函数体都为空 stm32f10x.it.h :该都闻见包含了所有的中断处理程序的原型。 main.c 例程代码
注意:DEBUG 模式中,宏 assert_param 被扩展,同时启动运行检错功能,但是 会增大代码尺寸,降低代码的运行效率。因此在最终程序中应该删除它们。
2 固件库:
文件夹 Examples
对应每一个 stm32 外设,都包含一个子文件夹。这些子文件夹包含了整套文件, 组成典型的例子,来示范如何使用对应外设。这些文件有:
stm32f10x_conf.h 项目配置头文件,默认为设置了所有的外设 stm32f10x_it.c 该源文件包含了所有的中断处理程序
stm32f10x_it.h 该头文件包含了所有的中断处理程序的原型 main.c 主函数体
stm32f10x_ppp.c 对应一个 stm32f10x_ppp.h
stm32f10x_type.h 文件中
布尔型变量
typedef enum {
FALSE = 0, TRUE = !FALSE } bool;
标志位状态类型 SET & RESET
typedef enum { RESET = 0,
SET = !RESET } FlagStatus;
功能状态类型 ENABLE&DISABLE
/*------------------ Serial Peripheral Interface ----------------*/ typedef struct { vu16 CR1; u16 RESERVED0; vu16 CR2; u16 RESERVED1; vu16 SR; u16 RESERVED2; vu16 DR; u16 RESERVED3; vu16 CRCPR; u16 RESERVED4; vu16 RXCRCR; u16 RESERVED5; vu16 TXCRCR; u16 RESERVED6; } SPI_TypeDef;
PPP_StructInit(&PPP_InitStructure); PP_InitStructure.memberX = valX; PPP_InitStructure.memberY = valY;
以上步骤可以合并在同一行里,用以优化代码大小:
PPP_InitTypeDef PPP_InitStructure = { val1, val2,.., valN}
b)仅设置结构体中的部分成员:这种情况下,用户应当首选调用函数 PPP_SturcIiit(… … )来初始化变量 PPP_InitStructure,然后在修改其中需要 修改的成员。这样可以保证其他成员的值(多为缺省值)被正确填入。
typedef signed long s32; typedef signed short s16; typedef signed char s8; typedef signed long const sc32; /* Read Only */ typedef signed short const sc16; /* Read Only */ typedef signed char const sc8; /* Read Only */ typedef volatile signed long vs32; typedef volatile signed short vs16; typedef volatile signed char vs8; typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; typedef unsigned long const uc32; /* Read Only */ typedef unsigned short const uc16; /* Read Only */ typedef unsigned char const uc8; /* Read Only */ typedef volatile unsigned long vu32; typedef volatile unsigned short vu16; typedef volatile unsigned char vu8; typedef volatile unsigned long const vuc32; /* Read Only */ typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */
文件夹 Library
包含组成固件函数库核心的所有子文件夹和文件:
子文件夹 inc 包含了固件函数库所需的头文件,用户无需修改该文件夹
stm32f10x_type.h 所有其他文件使用的通用数据类型和枚举 stm32f10x_map.h 外设存储器映像和寄存器数据结构 stm32f10x_lib.h 头文件夹,包含了其他头文件 stm32f10x_ppp.h 每个外设对应一个头文件,包含了该外设使用的函数原型,数 据结构和枚举 cortexm3_macro.h 文件 cortexm3_macro.s 对应的头文件
如 果想要进入 DEBUG 模式的话,必须在文件 stm32f10x_conf.h 中定义标签 DEBUG。这样会在 sram 的外设结构部分创建一个指针。因此我 们可以简化 DEBUG 过程,并通过转储外设获得所有寄存器的状态。在所有情况下,SPI2 都是指向 外设 SPI2 首地址的指针。
变量 DEBUG 可以仿照下例定义:
系统、 源程序文件和头文件命名都以“ stm32f10x-” 作为开头 寄存器作为常量处理 外设函数的命名以外设的缩写加下划线开头 每个单词的开头字母大写 每个函数名只有一个下划线分隔外设缩写和函数名的其他部分 ppp_Init :::根据 PPP_InitTypeDef 中指定的参数,初始化外设 PPP。 PPP_DeInit::::复位外设 PPP 的所有寄存器至缺省值 PPP_StructInit :::其功能为通过设置 PPP_InitTypeDef 结构中的各种参数 来定义外设的功能 PPP_Cmd:::使能或失能外设 PPP PPP_ITConfig:::为使能或者失能来自外设 PPP 某中断源
RESERVEDi(i 为一个整数索引值)表示被保留区域
stm32f10x_map.h 函数包含了所有的外设声明,下例为 spi 外设的声明:
#ifndef EXT #Define EXT extern #endif ... #define PERIPH_BASE ((u32)0x40000000) #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) ... /* SPI2 Base Address definition*/ #define SPI2_BASE (APB1PERIPH_BASE + 0x3800) ... /* SPI2 peripheral declaration*/ #ifndef DEBUG ... #ifdef _SPI2 #define SPI2 ((SPI_TypeDef *) SPI2_BASE) #endif /*_SPI2 */ ... #else /* DEBUG */ ... #ifdef _SPI2 EXT SPI_TypeDef *SPI2; #endif /*_SPI2 */ ... #endif /* DEBUG */