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