#include "stm32f10x.h"
#include <stdio.h> //下面strlen函數需要此頭文件
#include "USART.h"
/**********************************************************
** 函數名:u32tostr
** 功能描述: 將一個32位的變量dat轉為字符串,比如把1234轉為"1234"
** 輸入參數: dat:帶轉的long型的變量
str:指向字符數組的指針,轉換后的字節串放在其中
** 輸出參數: 無
***********************************************************/
void u32tostr(unsigned long dat,char *str)
{undefined
char temp[20];
unsigned char i=0,j=0;
i=0;
while(dat)
{undefined
temp[i]=dat%10+0x30;
i++;
dat/=10;
}
j=i;
for(i=0;i<j;i++)
{undefined
str[i]=temp[j-i-1];
}
if(!i) {str[i++]='0';}
str[i]=0;
}
/**********************************************************
** 函數名: strtou32
** 功能描述: 將一個字符串轉為32位的變量,比如"1234"轉為1234
** 輸入參數: str:指向待轉換的字符串
** 輸出參數: 無
** 返回:轉換后的數值
***********************************************************/
unsigned long strtou32(char *str)
{undefined
unsigned long temp=0;
unsigned long fact=1;
unsigned char len=strlen(str);
unsigned char i;
for(i=len;i>0;i--)
{undefined
temp+=((str[i-1]-0x30)*fact);
fact*=10;
}
return temp;
}
/**********************************************************
** 函數名: Usart_Configuration
** 功能描述: 串口1配置, 包括串口時鍾,GPIO配置
** 輸入參數: 無
** 輸出參數: 無
***********************************************************/
void Usart_Configuration(void)
{undefined
GPIO_InitTypeDef GPIO_InitStructure; //GPIO庫函數結構體
USART_InitTypeDef USART_InitStructure;//USART庫函數結構體
USART_ClockInitTypeDef USART_ClockInitStructure;
//使能串口1,GPIOA,AFIO總線
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);
/* Configure USART1 Tx (PA9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//PA9時鍾速度50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate =115200; //波特率115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位數據
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1個停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶失能
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制失能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //發送、接收使能
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;//空閑時鍾為低電平
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;//時鍾第二個邊沿進行數據捕獲
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;//最后一位數據的時鍾脈沖不從SCLK輸出
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Init(USART1, &USART_InitStructure); //初始化結構體
USART_Cmd(USART1, ENABLE); //使能串口1
}
//加入以下代碼,支持printf函數,而不需要選擇use MicroLIB
/***************************START*********************/
#if 1
#pragma import(__use_no_semihosting)
//標准庫需要的支持函數
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
_sys_exit(int x)
{
x = x;
}
//重定義fputc函數
int fputc(int ch, FILE *f)
{
USART1->DR = (u8) ch;
while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
return ch;
}
#endif
/***************************END*********************/
/**********************************************************
** 函數名:USART1_Putc
** 功能描述: 串口1發送一字符
** 輸入參數: c
** 輸出參數: 無
***********************************************************/
void USART1_Putc(unsigned char c)
{undefined
USART1->DR = (u8)c; //要發送的字符賦給串口數據寄存器
while((USART1->SR&0X40)==0); //等待發送完成
}
/**********************************************************
** 函數名:USART1_Puts
** 功能描述: 串口1發送一字符串
** 輸入參數: 指針str
** 輸出參數: 無
***********************************************************/
void USART1_Puts(char * str)
{undefined
while(*str)
{undefined
USART1->DR= *str++;
while((USART1->SR&0X40)==0);//等待發送完成
}
}
/**********************************************************
** 函數名:UART_Send_Enter
** 功能描述: 串口1發送一換行符
** 輸入參數: 無
** 輸出參數: 無
***********************************************************/
void UART_Send_Enter(void)
{undefined
USART1_Putc(0x0d);
USART1_Putc(0x0a);
}
/**********************************************************
** 函數名:UART_Send_Str
** 功能描述: 串口1發送一字符串,帶回車換行功能
** 輸入參數: 指針s
** 輸出參數: 無
***********************************************************/
void UART_Send_Str(char *s)
{undefined
for(;*s;s++)
{undefined
if(*s=='\n')
UART_Send_Enter();
else
USART1_Putc(*s);
}
}
/**********************************************************
** 函數名: UART_Put_Num
** 功能描述: STM32F的USART發送數值
** 輸入參數: dat:要發送的數值
** 輸出參數: 無
** 說明:函數中會將數值轉為相應的字符串,發送出去。比如 4567 轉為 "4567"
***********************************************************/
void UART_Put_Num(unsigned long dat)
{undefined
char temp[20];
u32tostr(dat,temp);
UART_Send_Str(temp);
}
/**********************************************************
** 函數名: UART_Put_Inf
** 功能描述: STM32F的USART發送調試信息
** 輸入參數: inf:指向提示信息字符串的指針
dat:一個數值,前面的提示信息就是在說明這個數值的意義
** 輸出參數: 無
***********************************************************/
void UART_Put_Inf(char *inf,unsigned long dat)
{undefined
UART_Send_Str(inf);
UART_Put_Num(dat);
UART_Send_Str("\n");
}
————————————————
版權聲明:本文為CSDN博主「慧聯工作室」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38426337/article/details/81158424