完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1 通用描述
1.1 STM8 STM8型号单片机分为STM8A、STM8L、STM8S三个系列。 STM8A:汽车级应用 STM8L:超低功耗MCU STM8S:标准系列 1.2 STM32 - F1系列用的最多,最大工作频率72MHz - STM32固件库(函数)使用手册 STM32F107:DWC2 FS OTG STM32MP157C-DK2:MPU STM32U5:U means ULP 1.3 ST开发板种类 ST官方出的有NUCLEO板、Discovery板以及评估板,配置从低到高,价格也是从低到高。 NUCLEO:一般只将MCU引脚引出,还有一个串口(通过STLINK USB虚拟),价格也就几十到100RMB左右。 Discovery板:一般比NUCLEO板多USB(MCU带USB),音频解码,耳机插孔。价格也就100多点。 评估板:功能是最全的,一般外设都有引出,功能最全,价格最高,几百到1000+RMB。 2 开发环境搭建 2.1 STM32CubeMX_V4.27.0 STM32CubeMX可以生成Atollic公司的TrueSTUDIO项目文件。 2.2 IAR8.30.1 IAR embedded Workbench 8.30 3 Reference Manual 3.1 STM32中文参考手册 In search engine, typo-in 《STM32中文参考手册》, then find “百度文库”, open it. 3.2 文档下载 如何在STM官网下载STM32英文数据手册datasheet 第一步 百度“ST官网”,点击进入第一个链接 第二步 点击目录Products-Microcontrollers(微控制器),进入芯片选择的页面 第三步,找到你对应的芯片型号,进到芯片的详细页面。这里我以STM32F103ZE为例。 第四步,芯片详细页面往下翻,找到Reference Manuals点击跳转到下载页面。 第五步,点击PDF下载,完成。 4 NVIC 4.1 中断服务程序 CMSIS IRQn = NVIC IRQn - 16 1)NVIC IRQn从1开始,所以NVIC中断1(Reset异常)对应CMSIS中断编号-15,NVIC中断16对应CMSIS中断编号0。 2)NVIC IRQn of SysTick等于15。 3)NVIC IRQn of PendSV等于14。 STM32的中断服务程序的名字不能自定义,必须使用官方已经定义好的名字,名字可参考如下的文件。 @ DriversCMSISDeviceSTSTM32L0xxSourceTemplatesiarstartup_stm32l061xx.s 当然服务程序的具体内容还是自己写,放在stm32f10x_it.c里。 4.2 BASEPRI FreeRTOS中进入临界区时没有关闭所有中断,而是使用优先级屏蔽寄存器BASEPRI(= configMAX_SYSCALL_INTERRUPT_PRIORITY)关闭了部分中断;这个寄存器最多有9位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成0,则不关闭任何中断,0也是缺省值。 FreeRTOS任务代码中临界段的进入和退出主要是通过操作寄存器BASEPRI实现的。进入临界区BASEPRI关闭了所有大于等于宏定义configMAX_SYSCALL_INTERRUPT_PRIORITY所定义的中断优先级,这样临界段代码就不会被中断干扰到,而且实现任务切换功能的 PendSV 中断和SysTick滴答定时器中断是最低优先级中断,所以此任务在执行临界段代码期间是不会被其它高优先级任务打断的。退出临界段时重新操作BASEPRI寄存器,即打开被关闭的中断(这里我们不考虑不受FreeRTOS 管理的更高优先级中断)。 Cortex-M内核的“中断优先级寄存器”是以最高位(MSB)对齐的。STM32使用了优先级寄存器中的4位,则这4个位位于中断优先级寄存器的bit 4、bit5、bit6、bit7位。剩余的bit0 ~ bit3可以设置成任何值。所以FreeRTOS中的中断优先级计算是有移位操作的。 CMSIS以及不同的微控制器供应商提供了可以设置某个中断优先级的库函数。一些库函数的参数使用最低位对齐,另一些库函数的参数可能使用最高位对齐,所以,使用时应该查阅库函数的应用手册进行正确设置。 可以在FreeRTOSConfig.h中设置宏configMAX_SYSCALL_INTERRUPT_PRIORITY和 configKERNEL_INTERRUPT_PRIORITY的值。(关于这两个宏可以参考参数设置一章,网址:http://openmcu.net/post/kernel-config.html)。这两个宏需要根据Cortex-M内核自身的情况进行设置,要以最高有效位对齐。比如某MCU使用中断优先级寄存器中的4位,设置configKERNEL_INTERRUPT_PRIORITY的值为5,则代码为: #define configKERNEL_INTERRUPT_PRIORITY (5《《(8-4)) 对于每一个官方FreeRTOS演示例程,这也是在FreeRTOSConfig.h中要设置宏configKERNEL_INTERRUPT_PRIORITY为最低优先级时,为什么要将它设置为255(1111 1111B)的原因。使用这种方式指定这个值的原因是,FreeRTOS内核是直接在Cortex-M内核硬件上运行的(没有使用第三方接口库函数),要比大多数库函数先运行。现在也有开发第一个Cortex-M库函数计划。 4.3 IPR typedef struct { vu32 ISER[2]; u32 RESERVED0[30]; vu32 ICER[2]; u32 RSERVED1[30]; vu32 ISPR[2]; u32 RSERVED2[30]; vu32 ICPR[2]; u32 RSERVED3[30]; vu32 IABR[2]; u32 RSERVED4[30]; vu32 IPR[15]; } NVIC_TypeDef; NVIC IPR[15]:Interrupt Priority Registers,中断优先级控制寄存器组。STM32的中断分组与这个寄存器密切相关。因为STM32的中断多达60多个,所以STM32采用中断分组的办法来确定中断的优先级。IPR寄存器由15个32bit的寄存器组成,每个可屏蔽中断占8bit,这样总共可以表示15x4=60个可屏蔽中断。IPR[0]的[31:24],[23:16],[15:8],[7:0]分别对应中断3到0,总共对应60个外部中断。而每个可屏蔽中断占用的8bit并没有全部使用,只用了高4位。这4位又分为抢占优先级和子优先级。这两个优先级要根据SCB-》AIRCR(System Control Block,Application Interrupt and Reset Register)中断分组的设置来决定。 简单介绍STM32的中断分组:STM32将中断分为0~4共5个组,该组是由SCB-》AIRCR寄存器的bit10:8来定义的。 通过这个表,可以清楚的看到组0~4对应的配置关系,例如组设置为0x03,此时所有的60个中断,每个中断的中断优先级寄存器的高四位中最高3位是抢占优先级,低1位是响应优先级。每个中断都可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级,数值越小所代表的优先级越高。 具体优先级的确定和嵌套规则: (1)只能高抢先优先级的中断可以打断低抢占优先级的中断服务,构成中断嵌套; (2)当2个(N个)相同抢占优先级的中断出现,他们之间不能构成中断嵌套,但STM32首先响应子优先级高的中断; (3)当2个(N个)个抢占优先级和子优先级相同的中断出现,STM32首先响应中断通道所对应的中断向量地址低的中断,就是谁先发生谁先被执行。 4.4 SHPRx-System Handler Priority Registers SHPR1至SHPR3,3个32位寄存器,每8位设置一个中断优先级,共12个可配置的系统中断,8为里面用了高位configPRIO_BITS,其它位写无效,读为0。还有3个中断的优先级系统默认为-3、-2、-1。 Figure 4-1 Cortex-M中断分布 Figure 4-2 SHPRx寄存器的位分配 4.5 示例代码 /* interrupt priority register */ static int command_dump_ipr(cli_node_t *cmd, int argc, char **argv) { const volatile uint8_t * const pcInterruptPriorityRegisters = (const volatile uint8_t * const)0xE000E3F0; uint8_t i; console_puts_lite(“”CR_LF); console_puts_lite(“configPRIO_BITS = %d”CR_LF, configPRIO_BITS); console_puts_lite(“configKERNEL_INTERRUPT_PRIORITY = 0x%02x”CR_LF, configKERNEL_INTERRUPT_PRIORITY); console_puts_lite(“configMAX_SYSCALL_INTERRUPT_PRIORITY = 0x%02x”CR_LF, configMAX_SYSCALL_INTERRUPT_PRIORITY); console_puts_lite(“”CR_LF); /* (4-7, 8-11, 12-15) */ console_puts_lite(“System Handler Priority Registers”CR_LF); for (i = 0; i 《 12; i++){ console_puts_lite(“PRI_%d - 0x%02x”CR_LF, (4 + i), SCB-》SHP); } console_puts_lite(“”CR_LF); console_puts_lite(“User Interrupt Priority Registers”CR_LF); for (i = 16; i 《 (16 + IRQ_NUMBER_MAX); i++) { console_puts_lite(“IRQ%d - 0x%02x”CR_LF, (i - 16), pcInterruptPriorityRegisters); } return 0; } DECLARE_CONSOLE_COMMAND(dump_ipr, command_dump_ipr, NULL); 5 Timer 5.1 STM32软件实施USB PD协议 USB PD通讯使用的是双相标记码(Bi-phase Mark Code,BMC,300KHz,bit rate 600kbps),此码是一种单线通信编码,数据1的传输需要有一次高/低电平之间的切换过程,数据0的传输则是固定的高电平或低电平。 TX:SPI1从模式MISO当作TX,SPI1 CLK通过配置TIM14产生,工作在600KHz(对应BMC 600kbps),ARR = 72Mhz / 600kbps,PSC = 0,72MHz频率输入,每计数12个(= 72MHz / 600kbps)触发产生一个SPI1从clk时钟。 SPI传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据,在发送前必须左对齐,如果接收的数据小于16位,则采用软件将无效的数据位屏蔽。 RX:TIM1 CH1输入捕获模式并用DMA接收数据。 输入捕获模式下:当捕获单元捕获到外来有效信号边沿事件(通过TIM1 CH1 Capture Compare Enable Register = 0xB设置上升沿和下降沿捕获,STM32库使用宏TIM_ICPolarity_BothEdge = 0x000A配置双边沿触发捕获),将此刻计数器的值锁存到CCR(Capture Compare Register,16bit)影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装寄存器,以供用户读取。DMA传输方式就是将CCR预装寄存器中的计数值传输到内存中。CCR寄存器中的计数值与上一次的计数值相减 x 计数频率的倒数 = 高电平或者低电平信号宽度。 输入捕获采样的频率就是定时器经过预分配器(PSC)之后的频率,譬如STM32F1 TIM1 CH1的计数器频率等于2.4MHz = 72MHz/(Prescaler + 1),那么计数器计数每增加4个就表示BMC(bit rate 600kbps)的一个bit。解码时,如果连续2次计数间隔之差都小于6,那么这2次计数间隔对应的4b5b bit是1,如果1次计数间隔之差大于6,说明这次4b5b bit是0。 https://github.com/alterapraxisptyltd/chromium-ec/blob/master/chip/stm32 MISO (DAT0): mi s əu MOSI (CMD): m əu si 6 USART 6.1 USART空闲中断 1)检测到接收数据后,在数据总线上的一个字节时间内,没有接收到数据触发空闲中断。RXNE置位一次,空闲总线就检测一次。 2)空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断。并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break中断)。 6.2 Hardware flow control 本地的RTS连接到对端的CTS,本地的CTS连接到对端的RTS,即交叉连接,其中RTS是输出,CTS是输入,并且RTS和CTS都是低电平有效。 参考STM32英文手册RM0008 Rev 20 page815,有详细的波形图描述。 6.3 USART synchronous mode 等效于SPI接口。参考STM32英文手册RM0008 Rev 20 page805,有详细的原理图描述。 MISO:mi s əu MOSI:m əu si 7 USB 纯软件实现USB1.1从协议 USBasp - USB programmer for Atmel AVR controllers https://www.fischl.de/u***asp/ HS握手时,Chirp KJ的频率大概是10KHz。 8 General Abbreviations AIRC:Application Interrupt and Reset Register ARR: Automatic Reload Register BKP: BackUp BSP:Board Support Package CCER: Capture/Compare Enable Register,用来判断当前是下降沿捕获中断还是上升沿捕获中断,同时也能随时改变上升沿捕获还是下降沿捕获 CCR: Capture/Compare Register,表示当前中断发生时的CNT寄存器的值,也就是用来判断时间的;PWM输出时作为占空比寄存器,函数是TIM_SetCompare1(。。.) CNT: Counter Register,用来计数的,每个定时器时钟周期自动+1,在需要的时间将其清零,便于计时 CmBacktrace:Cortex Microcontroller Backtrace,是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位、错误原因自动分析的开源库 CubeMX:Microcontroller GUI eCC-USB:eCos Centric USB GHS:Green Hills Software,提供GHS hypervisor(类似于QNX hypervisor)、仪表专用RTOS、MCU开发IDE IAR:后两个字母取之于创始人名字Anders Rundgren的首字母,瑞典语Ingenjörsfirman Anders Rundgren,意为Anders Rundgren工程公司 IAR icf:ILINK Configuration File MDATA:More DATA,USB ep双缓冲(ep_kind配置使能)切换机制对应到DATA0和DATA1 MSP:MCU Specific Package NVIC:Nested Vectors Interrupts Controller NVIC IPR:Interrupt Priority Registers OC:Output Compare(输出比较),用于输出PWM信号;寄存器CNT与CCR比较,大于输出1,小于输出0 PMA:Packet Buffer Memory Area PSC:PreSCaler register,预分频寄存器 RCC:Reset and Clock Control RCR:Repetition Counter Register,重复次数寄存器 SHPRx:System Handler Priority Registers SR: Status Register,用来判断是不是输入捕获中断 ST AMG:Analog and MEMS Group,模拟和MEMS部门(现在改成了Analog, MEMS and Sensors Group) STM32H7:High-perf Cortex-M7 STM32WB:WB表示集成了Wireless Bluetooth模块 STM32WL:WL表示集成了Wireless LoRa模块 PendSV:Pendable 服务是一个中断请求,如果没有其他中断需要响应时,系统将强制执行上下文切换 SVCall:SuperVisor Call由SVC指令触发,FreeRTOS用它来启动任务调度 USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset “warm reset” in some places and “BH reset” in other places. “BH” reset is supposed to stand for “Big Hammer” reset, but it also stands for “Brad Hosler”。 Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent. USB KVM:KVM是键盘(Keyboard)、显示器(Video)、鼠标(Mouse)的缩写;KVM端口是25-pin,包含VGA接口和USB接口 uSOF:micro Start of Frame,125us |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:05 , Processed in 1.178909 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号