L~WC9xguDl
stm8s 串口使用例程代码 I6jDRC0<
myR}~Cj;q
82EH'C
* 文件名 :uart.c q1|! oQ
* 描述 :串口通信配置函数库 /C'dW
* 实验平台:iCreate STM8开发板 `egyk)"aM
* 库版本 :V2.0.0 &s+F+8"P+
* 作者 :ling_guansheng QQ:779814207 l$>))cW!
* 博客 : p+t79F.js
*修改时间 :2011-12-20 f|U
J%}$v;
iCreate STM8开发板硬件连接 v>4kF _N
|--------------------| $bGe1\
| USART1_RX-PA4 | 5S;|U&f|
| USART1_TX-PA5 | )\!-n]+A
|--------------------| 5D~>Ed;
SWrt 4G
****************************************************************************************/ qv+8wJ((
U1.w%b,
#include "uart.h" IK
/@j
#include "stm8s.h" TB8a#bK4
#include "stm8s_clk.h" k~YZT 8
#include <stdarg.h> jn+M L&
/* ******************************************** _YT9zG
UART2 configured as follow: NIzxSGk|
- BaudRate = 115200 baud N9[2k.oBH
- Word Length = 8 Bits tW=,o&C=
- One Stop Bit KBb{Z;%
- No parity F1q a`j^'
- Receive and transmit enabled cP]5Qz
- Receive interrupt Me.t_)
- UART2 Clock disabled p5`d@y\hj
*********************************************/ 0Xke26ga
void Uart_Init(void) LK?V`J5wY
{ -9L[eYn
//恢复Uart2 默认值 jgkJF[t`
UART2_DeInit(); PXH"%vVF
A18 &9gY
//波特率 115200 #Fl5]> |
//字长 8位 = UART2_WORDLENGTH_8D nJ ZQRRa:C
//停止位 1 = UART2_STOPBITS_1 HgY#O
r(
//校验方式 无校验 UART2_PARITY_NO f:).wi
Ld
//同步模式 UART2_SYNCMODE_CLOCK_DISABLE 禁用 6{qI
//模式: 允许发送和接受 UART2_MODE_TXRX_ENABLE >o#^)LN
UART2_Init((u32)115200, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO , UART2_SYNCMODE_CLOCK_DISABLE , UART2_MODE_TXRX_ENABLE); ToNRY<!
clcj5=:
//中断配置 Data Register Not Empty interrupt !R`)S7!
UART2_ITConfig(UART2_IT_RXNE,ENABLE ); fV\ eksBF
%)|_&Rh
//启用Uart2 gk*Md+
UART2_Cmd(ENABLE ); xIrRFK9[Q
r2Wx31j{
} M[Kk43;QY!
3XOf-v:~
void UART2_SendByte(u8 data) */kX|Sur
{ ZRjqjx
UART2_SendData8((unsigned char)data); B!#F!Wk"
/* Loop until the end of transmission */ mp\`9j+{
while ( UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET ); Y?^1=9?6
} ZgXn8O[a
il)LkZ@
void UART2_SendString(u8* Data,u16 len) JLZ[sWP='
{ RyxEZ7dC<y
u16 i=0; ;M95A
for(;i<len;i++) c<(LXf+61
UART2_SendByte(Data); bay7%[BLB
P/'9k0zs)
} =36e&z-#
EK-Qa<[|
/* mJ>@Dh3>G
u8 UART2_ReceiveByte(void) $?dAO}f3O)
{ :*{>=BD
u8 USART2_RX_BUF; R
m{\ R
while (UART2_GetFlagStatus(UART2_FLAG_RXNE) == RESET); ][b2Q>
USART2_RX_BUF=UART2_ReceiveData8(); 6]#\|lds1
return USART2_RX_BUF; Ww
}qK|D
h,D6MP
} s`bC?wr5h
*/ xyoh
B#'W
/pa8>_, ~
/* [\j@_YYd
* 函数名:fputc &SzLEbU!
* 描述 :重定向c库函数printf到USART1 f
+#
* 输入 :无 hKT ]M[Pv
* 输出 :无 Mohy;#8Wk
* 调用 :由printf调用 m-~eCFc
*/ (,J`!Y hS
int fputc(int ch, FILE *f) lu GEBPi
{ Qe~2'Hw#9
/* 将Printf内容发往串口 */ 'k9?n)<DW
UART2_SendData8((unsigned char) ch); Lnk!zj
while (!(UART2->SR & UART2_FLAG_TXE)); .45XS>=z#
f[@M
return (ch); ~okIiC]#
} NjTVinz
`VT0wAe2;
/******************************************************** ~)S Q{eK?&
* 函数名:itoa A0NNB%4|/
* 描述 :将整形数据转换成字符串 9"@P.8_
* 输入 :-radix =10 表示10进制,其他结果为0 yqg&dq
* -value 要转换的整形数 C~2/ 5
* -buf 转换后的字符串 >PsP y.
* -radix = 10 "4{_amgm&<
* 输出 :无 5 i1T?
* 返回 :无 )$#r6fQO
* 调用 :被USART1_printf()调用 CIM9~:\
*******************************************************/ Y:nF.An3
static char *itoa(int value, char *string, int radix) !Q,A#N(
{ c=YJ:&/5&
int i, d; sP0pw]!
int flag = 0; >.D0McQg
char *ptr = string; (1bz.N8z
ZKGS?z
/* This implementation only works for decimal numbers. */ L`i#yXR
if (radix != 10) C?n3J
{ CqXD z
*ptr = 0; iL-I#"qT,
return string; 23/!k}G"
} (%fl
o:\RJig<
if (!value) O<R6^0B42
{ qAH@)}
*ptr++ = 0x30; LE_1H>
*ptr = 0; hT&,5zaWdv
return string; o6pnTu
} mm3goIi;Y
i^{.Q-
/* if this is a negative value insert the minus sign. */ 1i}Rc:
if (value < 0) _tfZg /+)
{ d[.kGytUt
*ptr++ = '-'; >4:W:;R
w;.'>ORC
/* Make the value positive. */ }b9#.H9
value *= -1; %h**L'~``
} l`2X'sw[/
eNlE]W,=
for (i = 10000; i > 0; i /= 10) 6 ^X$;
{ PXGS5,
d = value / i; r}i<cyL
d"nz/$
if (d || flag) N\<RQtDg
{ a1p:~;f}[
*ptr++ = (char)(d + 0x30); iTU8WWY<
value -= (d * i); /&=E=S6
flag = 1; Z*d8b
} \#5t%t
} 8<$6ufvOv
[L1pDICoy
/* Null terminate the string. */ 9?r|Y@xh ]
*ptr = 0; Q5e ,[1
wTFM:N
return string; e-4XNL[F
g$~3 @zD
} /* NCL_Itoa */ :X[(ymWNE
rE"`q1b#
/************************************************************************ c/ wzV
* 函数名:USART1_printf ]GYO`,
* 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库 &I.UEF2,
* 输入 :-USARTx 串口通道,这里只用到了串口1,即USART1 Nt#zr]Fz
* -Data 要发送到串口的内容的指针 : j&M&+
* -... 其他参数 t=iSMe
* 输出 :无 ]Ff"o7gT
* 返回 :无 "G P!]3t
* 调用 :外部调用 krZ J"`
* 典型应用USART1_printf( "\r\n this is a demo \r\n" ); AiSO|!<.N
* USART1_printf( "\r\n %d \r\n", i ); DO(-)izC
* USART1_printf( "\r\n %s \r\n", j ); ~=HN30
***************************************************************************/ s+>""yi
void USART2_printf( uint8_t *Data,...) L)VEA8}
{ 9|T%q2O
const char *s; i TY4X:x
int d; U9IP`)z_5t
char buf[16]; qUSImgg
va_list ap; In|:6YDL&
va_start(ap, Data); $rDeI-)S
g^(wZ$NH
while ( *Data != 0) // 判断是否到达字符串结束符 C>Qgd9
{ cj-P&D[Ny[
if ( *Data == 0x5c ) //'\' |@={:gRJ{x
{ ,+P!R0PNH
switch ( *++Data ) I,vy__sZ
{ {zBf *x
case 'r': //回车符 nnIBN4
UART2_SendData8(0x0d); XF(I$Mxl6
Data ++; km'3[}8o&
break; tfj6#{M5
8qn1?Lb
case 'n': //换行符 !v^D}P 3Y
UART2_SendData8(0x0a); Kxz<f>`b/
Data ++; JpE4 o2
break; blph&[`}I
@HJ&"72$<
default: bT}P":*y
Data ++; %(Sy XZ
break; }6.R.*Imz
} `?{QCBVj
} -WwFUm
else if ( *Data == '%')
bLGgu#
{ // [=9-AG~}
switch ( *++Data ) vmL%%7
{ >|!F.W
case 's': //字符串 KgX~PP>
s = va_arg(ap, const char *); M~w
=ZJ@
for ( ; *s; s++) 2}>jq8Y47
{ ,xB&{J
UART2_SendData8(*s); t>f<4~%MJ
while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET); p!>FPS
} mv%fX2.
Data++; Qn(e[
C6\
break; ;rJR+wpNa
fLL_{o0T
case 'd': //十进制 cjsQm6
d = va_arg(ap, int); jZS6f*$
itoa(d, buf, 10); ! lgsV..R
for (s = buf; *s; s++) <~t38|Ff@
{ eX7Ev'(H
UART2_SendData8(*s); ii0AhQ
while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET); <",4O
} Q+)fI
Data++; v'Gqdd-#)
break; Ev%4}GwO4
default: 9r@r\-
Data++; LEvdPG$)
break; "0 \U>h
} /4+M0P l
} /* end of else if */ !YSAQi ;I
else UART2_SendData8(*Data++); ~F^=7oq
while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET); -}@3,G
} 048BQ
} [>::@[