#include "Config.h"
u8 Uart_Receive_Flag=0;
u8 Uart_Send_len=0;
u16 Uart_Receive_len=0;
u8 Uart_Receive_Ack_len=0; //期望 接收到的ACK 長茺
u8 Uart_Send_Buf[UART_SEND_LEN];
u8 Uart_Receive_Buf[UART_RECEIVE_LEN];
void UART1_IO_Config(void)
{
PA_DDR_DDR3 =0;//輸入
PA_CR1_C13 =1;//上拉輸入
PA_CR2_C23 =0;
PA_ODR_ODR2 =1;
PA_CR1_C12 =1;//推挽輸出
PA_CR2_C22 =1;//輸出擺率10M
PA_DDR_DDR2 =1;//輸出高電平,TX空閑狀態為高電平,如果不設置,會莫名奇妙的發送0x00
//開啟引腳的UART功能
//00: USART1_TX on PC3 and USART1_RX on PC2
//01: USART1_TX on PA2 and USART1_RX on PA3
//10: USART1_TX on PC5 and USART1_RX on PC6
SYSCFG_RMPCR1_USART1TR_REMAP =1;//PC2,PC3 這個要搞懂
//如果需要使用其他引腳作為串口發送接收引腳,請在這里選擇
}
void UART1_CLK_EN()
{
CLK_PCKENR1_PCKEN15=1;//開啟USART外設時鐘
}
void UART1_CLK_DIS()
{
CLK_PCKENR1_PCKEN15=0;//開啟USART外設時鐘
}
void UART1_Mode_Config()
{
//設置串口工作方式
USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit
USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit
//設置波特率
//波特率設置為9600
// 2000000/9600=208 //2000000是此時系統的主時鐘頻率,默認8分頻,16M/8=2M
//208(DEC)=00D0(HEX)
USART1_BRR2 =0x03;//the BRR2 should be programmed before BRR1
USART1_BRR1 =0x68;
USART1_CR2_TEN=1;//使能發送
// USART1_CR2_TIEN=0;//打開發送中斷
USART1_CR2_REN=1;//使能接收.
USART1_CR2_RIEN=1;//打開接收中斷
}
void UART1_NVID_Config()
{
}
void UART1_Config()
{
UART1_IO_Config();
UART1_CLK_EN();
UART1_Mode_Config();// 9600 8 1 發送 接收 接收中斷
UART1_NVID_Config();
}
void Uart1_Send_Data(unsigned char data)
{
while(0 == USART1_SR_TXE); //判斷發送數據寄存器是否為空
USART1_DR = data; //向發送寄存器寫入數據
}
void Uart1_Send_String(u8 *data,u8 len,u8 enter_en)
{
u8 i=0;
for(i=0;i<len;i++)
{
Uart1_Send_Data(data[i]);
}
if(ENTER_EN == enter_en )
{
Uart1_Send_Data(0x0D);
Uart1_Send_Data(0x0A);
}
}
void UART_Receive_Buf_Clear()
{
Uart_Receive_len = 0;
Uart_Receive_Flag = 0;
}
void Send_ADC_Value(void)
{
Uart1_Send_String("val= ",5,ENTER_DIS);
Uart1_Send_Data(VDD_Value1/10 +0x30);
Uart1_Send_Data(VDD_Value1%10 +0x30);
Uart1_Send_String("V",1,ENTER_EN);
}
#pragma vector=USART_T_TXE_vector
__interrupt void USART_TX_ISR (void)
{
if(USART1_SR_TC==1);
}
#pragma vector=USART_R_RXNE_vector
__interrupt void USART_RX_ISR(void)
{
u8 ch;
if(1 == USART1_SR_RXNE)
{
Uart_Receive_Flag |= TRUE;
if(0x8000 != (Uart_Receive_len&0x8000))
{
Uart_Receive_Buf[Uart_Receive_len++] = USART1_DR;
if((Uart_Receive_len>=UART_RECEIVE_LEN)||(Uart_Receive_len>=Uart_Receive_Ack_len))
{
Uart_Receive_len |= 0x8000;
}
}
else
{
ch = USART1_DR;
}
}
}
|