?? usart.c
字號:
#include "stm32f10x.h"
#include "fsmc_sram.h"
#include "grlib/grlib.h"
#include "touchstreen.h"
#include "usart.h"
#include "misc.h"
#include "stdarg.h"
#include "lcdhal.h"
void USART_Config(USART_TypeDef* USARTx)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200; //速率115200bps
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; //收發模式
/* Configure USART1 */
USART_Init(USARTx, &USART_InitStructure); //配置串口參數函數
/* Enable USART1 Receive and Transmit interrupts */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能發送緩沖空中斷
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}
/****************************************************************************
* 名 稱:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
* 功 能:格式化串口輸出函數
* 入口參數:USARTx: 指定串口
Data: 發送數組
...: 不定參數
* 出口參數:無
* 說 明:格式化串口輸出函數
"\r" 回車符 USART_OUT(USART1, "abcdefg\r")
"\n" 換行符 USART_OUT(USART1, "abcdefg\r\n")
"%s" 字符串 USART_OUT(USART1, "字符串是:%s","abcdefg")
"%d" 十進制 USART_OUT(USART1, "a=%d",10)
* 調用方法:無
****************************************************************************/
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
{
const char *s;
int d;
char buf[16];
va_list ap;
va_start(ap, Data);
while(*Data!=0){ //判斷是否到達字符串結束符
if(*Data==0x5c){ //'\'
switch (*++Data){
case 'r': //回車符
USART_SendData(USARTx, 0x0d);
Data++;
break;
case 'n': //換行符
USART_SendData(USARTx, 0x0a);
Data++;
break;
default:
Data++;
break;
}
}
else if(*Data=='%'){ //
switch (*++Data){
case 's': //字符串
s = va_arg(ap, const char *);
for ( ; *s; s++) {
USART_SendData(USARTx,*s);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
Data++;
break;
case 'd': //十進制
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++) {
USART_SendData(USARTx,*s);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
Data++;
break;
default:
Data++;
break;
}
}
else USART_SendData(USARTx, *Data++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
}
/******************************************************
整形數據轉字符串函數
char *itoa(int value, char *string, int radix)
radix=10 標示是10進制 非十進制,轉換結果為0;
例:d=-379;
執行 itoa(d, buf, 10); 后
buf="-379"
**********************************************************/
char *itoa(int value, char *string, int radix)
{
int i, d;
int flag = 0;
char *ptr = string;
/* This implementation only works for decimal numbers. */
if (radix != 10)
{
*ptr = 0;
return string;
}
if (!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}
/* if this is a negative value insert the minus sign. */
if (value < 0)
{
*ptr++ = '-';
/* Make the value positive. */
value *= -1;
}
for (i = 10000; i > 0; i /= 10)
{
d = value / i;
if (d || flag)
{
*ptr++ = (char)(d + 0x30);
value -= (d * i);
flag = 1;
}
}
/* Null terminate the string. */
*ptr = 0;
return string;
} /* NCL_Itoa */
void USART1_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //復用開漏輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
}
/****************************************************************************
* 名 稱:void NVIC_Configuration(void)
* 功 能:中斷源配置
* 入口參數:無
* 出口參數:無
* 說 明:
* 調用方法:無
****************************************************************************/
void USART1_NVIC_Configuration(void)
{
/* 結構聲明*/
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
/* Configure one bit for preemption priority */
/* 優先級組 說明了搶占優先級所用的位數,和子優先級所用的位數 在這里是1, 7 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //設置串口1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優先級 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子優先級為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -