1 通用描述
1.1 STM8
Moto 6502 -> ST7 -> STM8
STM8型号单片机分为STM8A、STM8L、STM8S三个系列。
STM8A:汽车级应用
STM8L:超低功耗MCU
STM8S:标准系列

1.2 STM32
- F1系列用的最多,最大工作频率72MHz
- STM32固件库(函数)使用手册
STM32F107:2010,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
www.st.com/stm32cubemx

STM32CubeMX可以生成Atollic公司的TrueSTUDIO项目文件。

2.2 IAR8.30.1
IAR embedded Workbench 8.30
https://m.baidu.com/ala/c/m.3322.cc/mip/40168.html

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来定义的。如Table 4-1所示。
Table 4-1 AIRCR中断分组设置表

AIRCR[10:8]

bit[7:4]分配情况

分配结果

0

111

0:4

0位抢占优先级,4位响应优先级

1

110

1:3

1位抢占优先级,3位响应优先级

2

101

2:2

2位抢占优先级,2位响应优先级

3

100

3:1

3位抢占优先级,1位响应优先级

4

011

4:0

4位抢占优先级,0位响应优先级

通过这个表,可以清楚的看到组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[i]);
    }
    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[i]);
    }
    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 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

STM8和STM32开发总结相关推荐

  1. 如何查找STM32开发资料

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang Ⅰ.概述 该 ...

  2. Keil(STM32)开发环境-(5)烧写测试程序

    5. 烧写测试程序 5.1.编译目标文件 在烧写程序之前,需要对目标工程进行编译链接,这里keil有三种编译模式. 分别是[Translate].[Build].[Rebuild]. 图 -1 按钮在 ...

  3. STM32开发板基础学习篇

    问题咨询及项目源码下载请加群: 群名:IT项目交流群 群号:245022761 STM32学习篇1笔记心得: ===============嵌入式和stm32======== 1.什么叫嵌入式?   ...

  4. 基于STM32开发板的循迹小车设计

    STM32的简单应用之循迹小车 前言 智能寻迹基于自动引导机器人系统,可以实现小车自动识别路线.智能寻迹小车运用传感器.单片机.电机驱动及自动控制等技术实现,管理时自动寻迹导航.该技术已经应用于无人驾 ...

  5. NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)

    为了开发者能够快速入门BC28的开发,加快开发者的项目进度,开发出此款针对BC28的stm32开发板和完善的发送网络数据的示例程序(TCP协议.COAP协议),程序流程逻辑清楚,注释完善,上手就可以玩 ...

  6. buntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立

    之前在e络盟的意法半导体掏了一个STM32开发板挺好的,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了 ...

  7. STM32开发 -- UCOSII移植

    一.UCOS简介 之前讲过一部分UCOSII,参看:STM32开发 – UCOSII 但是讲的有点糙了,现在参看正点原子的STM32F4 UCOS开发手册 V3.0,重点看一下UCOSII和UCOSI ...

  8. STM32开发 -- 蓝牙开发详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...

  9. STM32开发 -- Ublox GPS之设置PUBX

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/99678012 STM32开发 – GPS模块开发详解 之前获取GPS所需内容需要解析多个 ...

  10. STM32开发 -- 地球坐标系(WGS84),火星坐标系(GCJ02), 百度坐标系(BD09)坐标转换

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/99599071 STM32开发 – GPS模块开发详解 最后有提到一下: WGS84坐标系 ...

最新文章

  1. 揭秘vue——vue-cli3全面配置
  2. windows10 下载 安装 使用 Sox
  3. WP8.1开发中复杂JSON绑定数据时的方法
  4. 零基础学习前端——html5
  5. java 使用 idea 调试 ysoserial
  6. curl 支持ws吗_curl 支持 http2
  7. linux aemv7,无法在我的Ubuntu machin中安装“xlwings”
  8. 第4章 Selenium2-java WebDriver API (三)
  9. docker server 容器连接sql_借力 Docker ,三分钟搞定 MySQL 主从复制!
  10. python for 加速_适合练习的10个Python项目,每个项目都不到500行代码
  11. Qt与VS2008的便捷安装(非编译源码方式),并解决错误“Unable to find a Qt build”
  12. linux入门常用命令
  13. keil c语言怎么写程序,用keil软件如何编写单片机程序?
  14. oracle rman 备份与还原
  15. Windows_5种方法解除Windows密码
  16. WHQL之无需HLK结果就可获得微软驱动数字签名+Cannot specify [ClassInstall32] section解决
  17. Python基础第六天:函数进阶
  18. IOS 苹果 App 转移图文详解
  19. word页码自增、页眉页脚的增长
  20. 5个好用的视频素材网站

热门文章

  1. 公众号如何涨粉?做微信seo疯狂涨粉技巧
  2. element ui 使用导航unique-opened问题
  3. 像把大象放入冰箱那样制造芯片
  4. 视频带宽(码流_分辨率_帧率)
  5. 1588 1-Step 和 2-Step PTP 之间有什么区别?
  6. QObject::connect: Cannot connect QTimer::timeout() to (null)::fuction()
  7. 开发愤怒的小鸟的Lua语言:Wax框架详解
  8. 系统上电后 bootloader的执行流程
  9. 华为畅享8plus停产了吗_华为畅享8和Plus哪个好? 华为畅享8 Plus与畅享8区别对比评测...
  10. Linux安装R相关包出现icudt error