STM8S103F3P6核心板学习笔记
本文最后更新于:2022年5月29日 上午
开发板与仿真器连接
仿真器 | STM8开发板 |
---|---|
3.3 | 3.3V |
SWIM | SWIM |
GND | GND |
RST | NRST |
新建一个项目
- 启动IAR,选择Project->Create New Projects…
- 选择C
- 然后选择路径并指定文件名,然后按Save保存
- 然后选Project->Options…设置项目属性
- General options -> Target -> Device -> STM8S -> STM8S103F3P
- Debugger -> Setup -> Driver -> ST-LINK
- Debugger -> ST-LINK -> 选中Verify
编译运行项目
- 选择Project -> Make,编译项目
(如果需要重新编译这个项目,可以选择Project -> Rebuild All)
选择Project -> Download and Debug, 把编译好的文件下载到电路板
选择Debug->Go运行程序
用IAR调试程序:
Toggle Breakpoint: 设置断点,程序运行到断点时会自动暂停
执行Download and Debug之后:
Go: 运行整个程序
Reset: 重置程序,回到第一行
Step over: 执行一条语句
View:
Disassembly: 显示C语言对应的汇编
Locals: 显示变量的值
Registers: 显示寄存器的值
Memory: 显示内存的内容
外部中断
外部中断处理函数:(不是所有I/O都支持EXTI,reference manual P66)
外部中断设置:(头文件 #include <intrinsics.h>)
Px_CR2寄存器:enable Portx external interrupt
EXTI_CR1寄存器:设置触发条件(Page 70 of Reference manual)
打开全局中断:__enable_interrupt()
-每组I/O口的中断号(IRQ number)都不同,Datasheet P43
-函数名可以任意。例如PORTA_EXTI_Handler()
IAR语法
1 |
|
USB转串口与STM8连接
把USB转串口上的跳线帽拨到3.3V处。
STM8开发板 | USB转串口 |
---|---|
PD6(UART1_Rx) | Tx |
PD5(UART1_Tx) | Rx |
GND | GND |
寄存器
主要寄存器共12个,常用的有5个:
寄存器 | 功能
-|-
UART_SR | 保存串口控制器的状态
UART_DR | 保存接收或者发送的数据
UART_CR2 | 设置串口模式
UART_BRR1 | 设置波特率(baudrate)
UART_BRR2 | 设置波特率(baudrate)
其他 | 保持默认设置,即使用串口8-n-1模式
波特率具体取值可以计算,也可以参考Reference Manual的22.3.4节的Table 54
中断函数
用特殊的语法定义,例如:
1 |
|
其中#pragma vector和__interrupt是固定的语法
UART1_T_TXE_vector指定这个中断处理函数是用来处理串口发送完毕中断
UART1_R_RXNE_vector指定这个中断处理函数是用来处理串口接收中断
UART1_T_TXE_vector和UART1_R_RXNE_vector在头文件iostm8s103f3.h中定义
UART1_T_TXE_Handler()和UART1_R_RXNE_Handler()函数名可以是任意
中断处理函数的内容要尽可能的短小,以免影响主程序的运行
定时器
定时器的时钟频率
Timer1的时钟频率 = fCK_PSC / (PSCR[15:0]+1)
Timer2/3的时钟频率 = fCK_PSC / 2^PSCR[3:0]
Update Interrupt
设置中断发生的周期:ARR(Auto-reload register)
中断发生频率 = 定时器频率 / (AAR+1)
产生中断的时间 = 1 / 中断发生频率
以Timer2为例,假设主频为16MHz:
TIM2_PSCR = 0x07; // psc=7 => prescaler=2^7 =128 => 定时器频率=16MHz/128=125KHz
退出中断前需要对相应的状态位清零。