概述:
在使用STM8L101F3這款單片機(jī)時(shí),由于它只有8K的flash,空間非常小,只要調(diào)用C庫(kù)函數(shù)printf編譯后整個(gè)文件很大,直接程序溢出。這也就意味著我們實(shí)現(xiàn)printf串口打印調(diào)試就沒(méi)辦法進(jìn)行。既然使用不了庫(kù)函數(shù),那么我們就可以自己動(dòng)手封裝類似printf的函數(shù),這樣我們就可以實(shí)現(xiàn)數(shù)據(jù)串口打印啦。這里就直接放上我的STM8L101F3的部分源碼了,希望可以給你一些參考。
源碼:
#include "stdarg.h"
#include "stm8l10x.h"
void USART_Config(void)
{
/*Set the USART RX and USART TX at high level*/
GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);
/* Enable USART clock */
CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);
USART_DeInit();
USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,
USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));
USART_Cmd(DISABLE);
enableInterrupts();
USART_Cmd(ENABLE);
}
/*發(fā)送串口數(shù)據(jù)*/
void send_uart_data(uint8_t data)
{
while (USART_GetFlagStatus(USART_FLAG_TXE) == RESET);
USART_SendData8(data);
}
/*
功能:將int型數(shù)據(jù)轉(zhuǎn)為2,8,10,16進(jìn)制字符串
參數(shù):value --- 輸入的int整型數(shù)
str --- 存儲(chǔ)轉(zhuǎn)換的字符串
radix --- 進(jìn)制類型選擇
注意:8位單片機(jī)int字節(jié)只占2個(gè)字節(jié)
*/
char *sky_itoa(int value, char *str, unsigned int radix)
{
char list[] = "0123456789ABCDEF";
unsigned int tmp_value;
int i = 0, j, k = 0;
if (NULL == str) {
return NULL;
}
if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {
return NULL;
}
if (radix == 10 && value < 0) {
//十進(jìn)制且為負(fù)數(shù)
tmp_value = (unsigned int)(0 - value);
str[i++] = '-';
k = 1;
} else {
tmp_value = (unsigned int)value;
}
//數(shù)據(jù)轉(zhuǎn)換為字符串,逆序存儲(chǔ)
do {
str[i ++] = list[tmp_value%radix];
tmp_value /= radix;
} while(tmp_value);
str[i] = '