167 lines
4.7 KiB
C
167 lines
4.7 KiB
C
#include "usart2.h"
|
||
#include "stdio.h"
|
||
#include "string.h"
|
||
#include "pbdata.h"
|
||
#include "stdarg.h"
|
||
//串口接收缓存区
|
||
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
|
||
u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //发送缓冲,最大USART2_MAX_SEND_LEN字节
|
||
vu16 USART2_RX_STA=0;
|
||
//清空数组
|
||
void USART2_ReceiveBuff_Clear(void)
|
||
{
|
||
USART2_RX_STA=0;
|
||
memset(USART2_RX_BUF,0,USART2_MAX_RECV_LEN);
|
||
}
|
||
|
||
//串口2配置函数
|
||
void USART2_Configuration(u32 baund)
|
||
{
|
||
USART_InitTypeDef USART_InitStructure;
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
NVIC_InitTypeDef NVIC_InitStructure;
|
||
|
||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能USART2
|
||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //GPIOB时钟
|
||
|
||
//NVIC_Configuration();
|
||
|
||
USART_DeInit(USART2); //复位串口1
|
||
|
||
//USART2_TX PB.10 PB.11
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
|
||
|
||
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
|
||
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
|
||
|
||
|
||
USART_InitStructure.USART_BaudRate = baund;
|
||
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||
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(USART2,&USART_InitStructure);
|
||
|
||
USART_Cmd(USART2,ENABLE);
|
||
|
||
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启USART2的接收中断
|
||
//Usart1 NVIC 配置
|
||
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口3中断通道
|
||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
|
||
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3
|
||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
|
||
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
|
||
|
||
USART_ClearFlag(USART2,USART_FLAG_TC); //清除发送完成标志位
|
||
|
||
}
|
||
|
||
//串口2,printf 函数
|
||
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
|
||
void u2_printf(char* fmt,...)
|
||
{
|
||
u16 i,j;
|
||
va_list ap;
|
||
USART2_ReceiveBuff_Clear();
|
||
va_start(ap,fmt);
|
||
vsprintf((char*)USART2_TX_BUF,fmt,ap);
|
||
va_end(ap);
|
||
i=strlen((const char*)USART2_TX_BUF); //此次发送数据的长度
|
||
for(j=0;j<i;j++) //循环发送数据
|
||
{
|
||
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
|
||
USART_SendData(USART2,USART2_TX_BUF[j]);
|
||
}
|
||
}
|
||
|
||
void timer2_init(void)
|
||
{
|
||
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
||
NVIC_InitTypeDef NVIC_InitStructure;
|
||
|
||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
|
||
TIM_TimeBaseStructure.TIM_Period = 999;
|
||
TIM_TimeBaseStructure.TIM_Prescaler = 3199;
|
||
TIM_TimeBaseStructure.TIM_ClockDivision = 1;
|
||
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
||
|
||
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
|
||
|
||
/* TIM IT enable */
|
||
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
|
||
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
|
||
/* TIM2 enable counter */
|
||
TIM_Cmd(TIM2, DISABLE);
|
||
|
||
/* Enable the TIM2 Interrupt */
|
||
|
||
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
|
||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||
NVIC_Init(&NVIC_InitStructure);
|
||
TIM_Cmd(TIM2, ENABLE); //使能TIMx
|
||
}
|
||
//设置TIM2的开关
|
||
//sta:0,关闭;1,开启;
|
||
void TIM2_Set(unsigned char sta)
|
||
{
|
||
if(sta)
|
||
{
|
||
|
||
TIM_SetCounter(TIM2,0);//计数器清空
|
||
TIM_Cmd(TIM2, ENABLE); //使能TIMx
|
||
}else TIM_Cmd(TIM2, DISABLE);//关闭定时器2
|
||
}
|
||
|
||
/**
|
||
* @brief This function handles TIM2 global interrupt request.
|
||
* @param None
|
||
* @retval None
|
||
*/
|
||
void TIM2_IRQHandler(void)
|
||
{
|
||
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
|
||
{
|
||
|
||
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
|
||
WKUP_PIN_Status=Key_Scan();
|
||
|
||
}
|
||
}
|
||
|
||
|
||
//串口2中断服务函数
|
||
void USART2_IRQHandler(void)
|
||
{
|
||
u8 res;
|
||
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
|
||
{
|
||
res =USART_ReceiveData(USART2);
|
||
if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
|
||
{
|
||
if(USART2_RX_STA<(USART2_MAX_RECV_LEN-1)) //还可以接收数据
|
||
{
|
||
// TIM_SetCounter(TIM2,0);//计数器清空 //计数器清空
|
||
// if(USART2_RX_STA==0) //使能定时器7的中断
|
||
// {
|
||
// TIM_Cmd(TIM2,ENABLE);//使能定时器7
|
||
// }
|
||
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
|
||
}else
|
||
{
|
||
USART2_RX_STA|=1<<15; //强制标记接收完成
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|