一、入门
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,主要包括STM32F101“基本型”系列、STM32F103“增强型”系列、STM32F105、STM32F107“互联型”系列。STM32微控制器满足嵌入式开发低功耗和高性能的要求,并且拥有简单易上手的固件函数库,避免了传统ARM单片机开发操作寄存器的模式,所以十分受欢迎,应用广泛。
作者只学过一些51单片机的基础,就直接上手STM32,边学边用。该篇笔记也是随意的记录一下,要想系统的学习一下,个人认为资料手册(data sheet)、参考手册(Reference Manual)和用户手册(固件函数库)三个文档再有开发板实际操作,完全足够。熟练掌握以上内容,触类旁通,成为STM32开发的高手指日可待。
目标->实战项目
STM32学习方法
开发环境(MDK/IAR) 寄存器or固件库 软件仿真&开发板硬件 学习难度
建立不受库版本的工程项目:
1.准备好文件 (Startup Code、Lib、User)
2.建立工程 不添加Startup Code
3.工程管理 添加需要的库文件、自定义文件
4.编译链接
ARM简介
ARM7衍生出全新的Cortex架构,三管齐下:
Cortex-A:高性能应用处理器。(越来越接近电脑)
Cortex-R:专门针对实时、深度嵌入式的解决方案。(又快又实时)
Cortex-M:专注低成本嵌入式微控制器。(好用又便宜)
Cortex-M中低端的芯片
Cortex-M0:针对FPGA应用 Cortex-M1:替代低成本MCU Cortex-M3:占领高性能MCU市场
Cortex-M3特点:高性能(哈佛结构+分支预测)、高集成度(单芯片)、高代码密度(Thumb2指令集)、内嵌NVIC中断(响应速度快)、低成本(最便宜的不到1美元)。
Cortex-M3处理器产品:STM32系列(瑞士 意法半导体ST)、Stellaris 系列(美TI)、LPC1000系列(荷兰NXP)、AT91SAM3系列(美Atmel)
STM32103VCT6引脚:
80*GPIO或(外设)引脚复用 电源相关、复位、晶振)
ATmega128是Atmel公司的8位系列单片机的最高配置的一款单片机。
ARM流水线 指令处理:
二、外设功能模块
STM32库函数
库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。
灵活使用、驾轻就熟。
GPIO原理与工作模式
1.设置GPIO引脚的工作模式
2.引脚位运算: 寄存器BSRR/BRR
位绑定:位n 映射到 内存地址a if a=0x01 低地址为1 则n =1
运算高效(替代读-修改-写)
可绑定区域 SRAM 0空间
位绑定公式: AliasAddr = 0x2200 0000 +((A-0x2000 0000)*8 +n)*4 n=(0 ~ 31)
– 0x2000 0000)*32 + 4*n
片上外设
位绑定公式:
– 0x4000 0000)*32 + 4*n
位绑定操作:
位绑定公式:
位绑定编程:#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))
串行通信
74LS1芯片实现串转并的功能:18 仿真通信、逻辑分析仪
异步串行通信:
协议内容:1起始位 2数据位(8、9奇偶校验) 3停止位 (1、1.5、2周期)4波特率设置
串行异步收发转RS232(高电平),最远传输十几米。 RS485最远3000米,最大速率1Mbps,噪声干扰好。
数据发送过程:1、CR1使能UE位。 2、定义字长M 3。3、CR2设置编程停止位STOP。*4、配置DMA寄存器(多缓冲)5、CR1发送使能TE。6、BRR寄存器设置波特率。7、写数据到DR寄存器。
数据接收过程类似。
串口编程:
1、打开时钟RCC,引脚设置:Rx浮空输入 Tx 推挽输出 2、将USART3的RX、TX重映射到PC10、PC11 ,USART3配置。3、USART_SendData( USART3 , 0xf0);
硬件下载与调试
1、STM32芯片的内部存储结构 2、FLASH下载与调试设置 3、RAM下载与调试设置
FLASH调试(0x0800 0000)只能烧写1000次。 RAM调试(0x2000 0000)
芯片唯一UID地址:0x1FFF F7E8 – 0x1FFF F7F4 96bit/8 = 12 Byte
ID_num[i] = *(u8 *) ( 0x1FFF 7E9 + i) i->12
Printf(“%x” , ID_num[i]);
Cortex-M3复用功能(AF)和重映射功能
复用功能配置(AFIO_MAPR 复用重映射和调试I/O配置寄存器)
GPIO_PinRemapConfig(选择重映射的管脚 , 重映射的新状态)
重映射优点:1、改善硬件设计 2、额外增加资源
UART-Printf重新定向
Int fputc(int ch , FILE *f)
{
//ch送到串口
USART_SendData(USART1 , ch);
//等待发送完毕
While(USART_GetFlagStatus( USART1 , USART_FLAG_TC) == RESET );
//返回ch
Return(ch);
}
Systick的使用
1、延时 2、心跳 传统的延时(空等待)for( i=0; i SysTick_CounterCmd( )使能SysTick计数器。 使能SysTick中断。 SysTick_CLKSourceConfig( )时钟源设置。 设置重装载值。 通用定时器 1、TIM1和TIM8是能产生3对PWM互补输出的高级定时器,常用于电机的驱动,时钟由APB2产生。 2、其他6个为普通定时器,时钟由APB1产生。 Timer作用:1、定时功能 2、计数功能 3、输入捕获 4、匹配输出 5、PWM脉冲波 原理5部分:1、时钟源 2、时基部分 3、输入 4、输出 5、寄存器部分 定时器配置 1、开启时钟RCC_APB1PeriphClockCmd( )。 2、利用TIM_DeInit( )函数将Timer设置成默认缺省值。 3、TIM_InternalClockConfig( )选择TIMx来设置内部时钟源。 4、TIM_Prescaler()设置预分频系数。 5、TIM_ClockDivision()来设置时钟分割。 6、TIM_CounterMode()来设置计数器模式。 7、TIM_Period() 来设置自动装入的值。 8、TIM_ARPPreloadConfig() 来设置是否使用预装载缓冲器。 9、TIM_ITConfig() 来开启TIMx的中断。 SPI与数码管 74HC595芯片:串转并 当SCLR为低电平时,输出端Q清零。 当SCLR为1,SCK出现上升沿时,内部寄存器移位并接受SER端发出来的数据。 当RCK出现上升沿时,74HC595内部寄存器的数据输出到QA—QH端。 SPI串行接口 SPI是Motorola公司提出的一种同步串行外围接口。在低速、低功耗、需保存少量参数的智能化传感系统中得到了广泛应用。 主要信号:1、MOSI 2、MISO 3、SCK串行时钟 4、SS从机选择信号,低电平有效。 SPI主模式通信设置步骤: 1、通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率。 2、选择CPOL和CPHA位,定义数据传输和串行时钟的相位关系。 3、设置DFF位来定义8位或16位数据帧格式。 4、配置SPI_CR1寄存器的的LSBFIRST位定义帧格式。 5、如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS引脚连接到高电平;在软件模式中,需设置SPI_CR1寄存器的SSM和SSI位,如果NSS引脚工作在输出模式,则只需设置SSOE位。 6、必须设置MSTR和SPE位(只当NSS连接到高电平,这些位才能保持置位)。 在这个配置中,MOSI引脚是数据输出,MISO引脚是数据输入。 I2C通信 I2C bus是Philips公司推出的一种基于两线的芯片间串行传输总线。采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件具有了最简单而灵活的拓展方法。 特点:1、二线传输 2、无中心主机 3、软件寻址 4、应答式数据传输过程 5、节点可带电接入或撤出 *在I2C总线上只需串行数据SDA线和串行时钟SCL线两条线。 I2C配置 1、开启端口、模块(IIC)时钟 2、相应引脚初始化(开漏输出)/*重映射配置 3、I2C配置 I2C_Init() 4、发送过程 1)发送起始信号,while等待起始信号发送事件并清除。 2)发送器件地址,while等待发送结束 3)发送器件内部写入地址,while等待移位寄存器空 4)发送数据,while等待发送缓冲区空 5)发送停止信号 EEPROM使用 CAT24WC16芯片是CATALYST(美凯特里斯)公司(已被安森美半导体ONSEMI)收购,生产的串行电可檫除的可编程存储器。 NVIC中断 CM3中断优先级:抢占式优先级(主)和响应优先级(从)。 STM32中断编程的规定动作: 1、时钟配置 2、GPIO配置 3、EXTI配置(中断源选择、清除中断标志、触发模式等) 4、NVIC配置() 5、中断服务子程序 PWM基础 1、PWM即Pulse Width Modulation,脉冲宽度调制。是一种对模拟信号电平进行数字编码的方法。等效的实现是基于采样定理中一个重要的结论:冲量相等而形状不同的窄脉宽加在具有惯性的环节上时,其效果基本相同。冲量即窄脉冲的面积,效果相同指的是该环节输出响应波形基本相同。 2、STM32除了TIM6和7都可以产生PWM,其中高级定时器TIM1和8可同时产生多达7路的PWM输出。其他通用定时器也可产生多达4路PWM输出。 RCC内部结构与原理 时钟是STM32的脉搏,是驱动源。外设的使用,打开和关闭对应的时钟,节能降低功耗。 设置时钟流程: 1、RCC_DeInit()默认值 2、打开外部高速时钟晶振HSE。RCC_HSEConfig( ) 3、等待HSE工作。 RCC_WaitForHSEStartUp() 4、设置AHB时钟。RCC_HCLKConfig( ) 5、设置高速APB时钟。RCC_PCLK2Config( ) 6、设置低速APB时钟。RCC_PCLK1Config( ) 7、设置PLL 。RCC_PLLConfig( ) 8、打开PLL。 RCC_PLLCmd(ENABLE ) 9、等待PLL工作。 While( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET ) 10、设置系统时钟。RCC_SYSCLKConfig() 11、判断是否PLL是系统时钟。While(Get_SYSCLKSource() != 0x08) 12、打开要使用的外设时钟。RCC_APB2PeriphClockCmd( )/ RCC_APB1PeriphClockCmd( ) RTC结构和特点 1.RTC结构包含两个部分。 1)APB1接口部分(控制寄存器) 2)有可编程计数器组成,分两个模块。预分频模块和32位计数器模块,前者产生秒信号和秒中断,后者产生闹钟中断。 2.RTC特点 1)可编程的预分频系数:最大分频系数为220。 2)32为可编程计数器,用于较长时间段的测量。 3)2个单独时钟,用于APB1接口的PCLK时钟和RTC时钟。(RTC时钟小于PCLK四分之一以上) 4)两种的复位类型:APB1接口由系统复位,RTC只能由后备域复位。 5)3个专门的可屏蔽中断:闹钟中断,秒中断,溢出中断。 RTC配置过程: 1.查询RTOFF位,直到该位置“1”。 2.置CNF位为“1”,进入配置模式。 3.对一个或多个RTC寄存器进行写操作。 4.清除CNF位,退出配置模式。 5.查询RTOFF位,直到RTOFF位变为“1”以确认写操作完成。(仅当CNF标志位被清除时,写模式才能进行,这个过程至少需要3个RTCLK周期) RTC使用 1.打开APB1总线上的PWR、BKP时钟。 2.使能RTC和后备寄存器访问。 3.复位备份寄存器设置 4.打开RTC时钟(外部或系统) 5.打开RTC寄存器同步(APB1) 6.RTC使能秒中断,闹钟中断,分频值32767k。(RTC_WaitForLastTask( ) ) 7.设置当前时钟值。 ADC模数转换 STM32拥有1~3个ADC,可以单独使用,也可以使用双重模式(提高采样率)。 STM32的ADC是12位的逐次逼近型的模数转换器。有18个通道,可以测量16个外部2个内部信号源,各通道A/D转换可以单次、连续、扫描或间断模式执行。 模拟看门狗允许应用程序检测输入的电压是否超出用户定义的阈值。 最大转换速率1Mhz,转换时间为1us(在ADCCLK=14Mhz,采样周期为1.5个ADC时钟下得到)若ADC的时钟超过14Mhz,则采样准确率下降。 内部温度传感器 1、与ADCx_IN16相连。 2、-40—125度测量范围,精度为1.5度。采样时间大于2.2us。 3、配置ADC_CR2寄存器TSVREFE位,唤醒关电模式下的温度传感器。 4、设置ADCON位启动ADC(或外部触发)。 5、读ADC数据寄存器的V SENSE结果。 6、利用公式算出温度:T = ((V25 – Vsence)/Avg_Slope + 25) 窗口看门狗 Twwdg = Tpclk1 * 4096 * 2 (WDGTB) *( T[5:0] + 1) ; ms 在0x40—设置窗口值之间喂狗,否则过早或过晚都会引起复位。用于时间要求严格的特殊应用。 低功耗模式与唤醒 三种低功耗模式:1)睡眠模式 2)停止模式 3)待机模式 )*正常运行下降低功耗 在产品是电池供电时,适合配置低功耗模式。并根据最低电源消耗,最快启动时间和可用唤醒源来选择最佳的低功耗模式。 USB应用 Universal Serial Bus通用串行总线,包括USB1.0/1.1,USB2.0,USB OTG。 USB1.1协议: 1、信号层:NRZI反向不归零编码方式 2、协议层:数据包6部分同步字段、包标示符、地址字段、数据字段、检验字段、包结束。 3、数据传输层4种方式:控制传输,同步传输,中断传输,大容量数据传输。 USB设备协议 当一个USB设备插入后的活动:供电复位获取设备描述符复位(可选)分配地址获取设备描述符获取配置描述符获取字符描述符(可选)配置 STM32实现USB设备的操作: 1、根据应用选择合适的USB类实现。 2、根据所选择的USB类协议,完成各个描述符。 3、根据描述符初始化端点数目,分配各端点所需使用的Packet Buffer。 4、初始化所使用的端点,配置端点的传输类型、方向、Packet Buffer地址和初始状态。 5、在需要接收或发送数据的时候,使能端点。 6、在该端点的中断回调函数中,处理数据,如果需要则使能下一次传输。 STM32的USB库函数: Stm32f10x_it.c :包含USB中断服务程序,由于USB中断有很多情况,这里的中断服务程序只是调用usb_Istr.c文件中的USB_Istr函数。由USB_Istr函数再做轮询处理。 usb_Istr.c:该文件只有一个usb_Istr函数,对USB中断事件做轮询处理。 usb_prop.c : 该文件用于实现相关设备的USB协议,例如初始化、SETUP包、IN包、OUT包。 usb_pwr.c: 该文件包含处理上电、掉电、挂起和恢复事件的函数。 hw_config.c: 该文件包含系统配置的函数。 三、问题 串口引脚 1 载波检测(DCD) 2 接受数据(RXD) 3 发出数据(TXD) 4 数据终端准备好(DTR) 5 信号地线(SG) 6 数据准备好(DSR) 7 请求发送(RTS) 8 清除发送(CTS) 9 振铃指示(RI) USBASP接口引脚 在线调试 1) 在线调试时,出现“CPU is not halted”,是因为没有关闭看门狗。 2) 在没有任何操作的情况下,STM32通用推挽输出模式的引脚默认低电平,也就是有电的状态,虽然电平小没有电阻也可以驱动LED灯点亮,这就是为什么引脚控制LED灯要接下拉(或上拉)电阻。 3) 串行通信协议:串行通信协议分同步协议和异步协议。(1)异步通信协议的实例——起止式异步协议。(2)面向字符的同步协议。(3)面向比特的同步协议。其中面向比特的同步协议帧格式如下: 4) systick中断处理函数中,如果处理很多函数,那么在时钟单位内,可能处理不过来,导致不停复位。 5) 485通信采用半双工通信,发送时控制信号高电平,接收时控制信号为低电平,通信为主从模式。 6) CAN通信为多主通信,属于全双工通信。若初始化配置没问题,其他应该问题不大,终端电阻(一般120欧)是保证通信质量的,简单短线组网,不加电阻也是可以。下载本文