usart1.c
3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "usart1.h"
#include "dev.h"
#include "delay.h"
#include "string.h"
#include "timer3.h"
#define USART1_RX_MAX 40
#define USART1_TX_MAX 40
uint8_t USART1_RX_BUF[USART1_RX_MAX] = {0}; //接收缓存区
uint8_t USART1_TX_BUF[USART1_TX_MAX] = {0}; //发送缓存区
Uart_Type u1;
void usart1_init(uint32_t bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
memset(USART1_RX_BUF,0,USART1_RX_MAX);
memset(USART1_TX_BUF,0,USART1_TX_MAX);
u1.rx_buf=USART1_RX_BUF;
u1.tx_buf=USART1_TX_BUF;
u1.rx_len=0;
u1.tx_len=0;
u1.rx_status = RX_STA_RST;
u1.rxtimer = &timer3;
timer3_init(usart1_rx_finished);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能USART1时钟
GPIO_PinAFConfig(DBG_RXD_Port,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
GPIO_PinAFConfig(DBG_TXD_Port,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
GPIO_InitStructure.GPIO_Pin = DBG_RXD_Pin | DBG_TXD_Pin; //GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(DBG_RXD_Port,&GPIO_InitStructure); //初始化
USART_InitStructure.USART_BaudRate = U1_BAUDRETE; //波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_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_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启相关中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 3; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //初始化VIC寄存器
}
void usart1_send_byte(uint8_t one_byte)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_SendData(USART1,one_byte); //向串口3发送数据
}
void usart1_send_bytes(uint8_t* buf,uint16_t length)
{
for(uint16_t i=0;i<length;i++)
{
usart1_send_byte(buf[i]);
}
}
void usart1_rx_reset(void)
{
u1.rx_len=0;
memset(u1.rx_buf,0,USART1_RX_MAX);//接收缓存区清零
u1.rx_status = RX_STA_RST;
}
void usart1_rx_receiving(void)
{
u1.rxtimer->timeclear();
u1.rxtimer->start();
u1.rx_status = RX_RECEIVING;
}
void usart1_rx_finished(void)
{
u1.rxtimer->stop();
u1.rx_status=RX_FINISHED;
}
void USART1_IRQHandler(void)//串口2中断服务程序
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断
{
uint8_t res;
res = USART_ReceiveData(USART1);//读取接收到的数据
switch(u1.rx_status)
{
case RX_STA_RST:
{
u1.rx_len = 0;
u1.rx_buf[u1.rx_len++] = res;//记录接收到的值
usart1_rx_receiving();
} break;
case RX_RECEIVING:
{
u1.rx_buf[u1.rx_len++] = res;//记录接收到的值
if(u1.rx_len==USART1_RX_MAX)
{
usart1_rx_finished();
}
else
{
usart1_rx_receiving();
}
} break;
case RX_FINISHED:
{
} break;
default: break;
}
}
else
{
}
}