本帖最后由 toofree 于 2019-3-2 02:35 编辑 8 h# p5 W6 g! r @ 【STM8-SO8-DISCO】——8、测试 UART1_Printf 本贴测试STM8S001J3M3的串口打印。 本实验基于样例程序“STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_Printf”,复制全部文件。# U1 |( r( c/ x! }3 p) o 7 J$ e" f4 Z Q" M1 J& ^. j 复制一个工程模板文件夹,改名为“STM8S_StdPeriph_UART1_Printf”,将上一步复制的5个文件,粘贴到本文件夹下。 ! Z k/ \9 P7 B" y: v 复制上电复位后延时5S的汇编程序1 I3 v' I/ A$ b$ I4 N 6 K c, s6 M! v9 B1 x K$ n 在程序最开头添加一条“STARTUP_SWIM_DELAY_5S;”,否则芯片将会被锁(SWIM管脚失效)。, u. k: D$ I% Y5 Q V/ ^ 接下来三条函数“CLK_HSIPrescalerConfig()”、“UART1_DeInit()”、“UART1_Init()”都为库中标准函数,没有做任何修改。4 a5 ?: e6 c( G( Q' b, Y; z* m 完成的功能分别是:设置时钟为16MHz、将UART用到的寄存器全部复位、设置新的UART参数。串口参考也很明确,波特率115200、8位数据、1位停止、无校验、串口同步时钟不使能(即异步串口)、收发使能(即全双工)。 初始化串口完成后,串口打印输出两行测试字符串。在主循环中,接收从上位机串口发送来的数据,并打印输出到上位机串口,回环测试。6 f3 {( @2 u' F 3 P: {- L7 `1 {# Q3 j 对串口收、发进行重定义,对应putchar()、getchar()函数,putchar()为printf()功能需要调用的底层。 * ]: H4 ]4 k8 [2 K 用STM8CubeMX生成个STM8S001J3M3的配置,只添加UART1设备,发现UART1_RX、UART1_TX分别被定义到了第1和第5脚。经测试在第5脚上没有输出串口数据。STM8CubeMX坑爹了一把,谨慎使用。; m/ \. G6 V$ G% z6 Y0 z9 }( V : T2 [/ C- Y8 c8 Y' y" Y 经查看数据手册,一般UART_TX应该在第8脚。本身第5脚也是有UART_TX功能的,不过是只能算是重映射复用功能,需要重映射才能使用。 0 q$ W) p5 y- r, y4 Q; z/ Y& H" s 数据手册显示,两个UART_TX似乎有点不一样,一个带方括号,一个不带。1 ~! Y% T- B& H% A ; E' S: H# W8 l4 P7 C w 带方括号的为重映射复用功能管脚。& L5 v0 Y; ?+ h: i $ F' u! l- z+ M( X2 B) T; s, ` 不带方括号的为默认复用功能管脚。要使用重映射复用功能的话,需要修改AFR0、AFR1。# X( w! B+ A! e; ` AFR0、AFR1又属于“选项字节”中的AFR选项。除了ROP是只使用一个字节外,其余选项字节全部由两个字节组成,数据位相反。具体怎么使用“选项字节”,水太深,这里暂时跳过,不用考虑。: b8 e5 Z% f' r! a- B 总之,一句话,UART_TX功能要用第8脚的,第5脚的暂时玩不转。/ R9 g" }) z2 a& i/ p$ f 综上,最终测试连线,需要用U1(DIP8座子),U1第1、2脚对应功能为UART1_TX、UART_RX,分别连接上位机USB转TTL串口的RX和TX管脚。" [9 [0 h! C- K; S- Y+ R" S6 t 实验连线如下图。0 X! S$ w V. x e; P+ U4 K9 `/ ~ + b# e& y# w- h, d- Y 编译,下载程序,并全速运行。 实验现象为:程序运行5S后,在上位机串口终端窗口打印输出两行测试字符串;接下来进入主循环,上位机键盘敲入字符,经STM8串口接收后,原数返回给上位机。2 {" g8 J5 o! N8 G" I / y! w5 U; i0 E* P7 d 本贴测试工程附上:+ b4 G \& H% ~% L, @5 i M |
9 ~' a9 L) n$ R9 ?' Y
直接按模板编译时会报错。主要是STM8S001J3芯片的Flash只有8K,而程序中使用了printf,因此编译出来的目标程序太大了,导致链接不成功。5 s! c1 ^5 v7 l( x& m
在模板工程的库选项设置中,printf功能支持太全,导致编译出的子程序较大。
3 O* l7 _, b5 _1 T; C" M
修改成“samll”级别,编译生成的目标程序就会小很多。
在.map文件中,可以看到,代码大小不到4K。最后才能成功生成目标程序。
# H% D# r6 D, K. Y
2 X/ R+ \1 }1 {) y9 J, z
: M8 v+ K2 n/ k: {( `
- c1 c' @- p K) J9 e
补充一下:% Y" l$ a* _% n- b
程序中应该添加一条 #include <stdio.h>
否则,printf打印变量或数组时有问题,打印常量字符串时没问题。
多谢捧场
我自己拿块芯片,外围什么电路都没有,就只是试串口的TX,按照官方资料里给出的代码,5秒延时也加了,芯片还是一直被锁,都有十几片了
期待ing~~" V& u2 \* a6 U5 F
让你说得,我都不敢试了
你找找看呗,念在你第一次在社区发贴,破例回复一次你这样的问题。