Files
SM-1000M/IAPV1.1/Driver/usart/usart1_sdi.c
2026-04-23 10:50:18 +08:00

148 lines
4.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "usart1_sdi.h"
#include "bsp.h"
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
char USART1_SDI_RX_BUF[USART1_SDI_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
char USART1_SDI_TX_BUF[100];
//接收状态
//bit15 接收完成标志
//bit14 接收到0x0d
//bit13~0 接收到的有效字节数目
u16 USART_SDI_RX_STA=0; //接收状态标记
void USART1_SDI_Configuration(u32 baund)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
Enable_SDI_RS232=0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1_SDI_SDI
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIOA时钟
//NVIC_Configuration();
USART_DeInit(USART1); //复位串口1
//USART1_SDI_SDI_TX PB.6 PB.7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
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(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);
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_Even; //奇校验数据位变为7位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启USART1_SDI_SDI的接收中断
//USART1_SDI_SDI NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口3中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
USART_ClearFlag(USART1,USART_FLAG_TC); //清除发送完成标志位
}
void USART1_SDI_CLR_RXBuf(void)
{
memset(USART1_SDI_RX_BUF, 0, USART1_SDI_REC_LEN);
USART_SDI_RX_STA=0;
}
void USART1_SDI_SDI_CLR_TXBuf(void)
{
memset(USART1_SDI_TX_BUF, 0, 100);
}
void u1_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART1_SDI_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART1_SDI_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART1,USART1_SDI_TX_BUF[j]);
}
}
//void timer4_init(void)
//{
// TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// NVIC_InitTypeDef NVIC_InitStructure;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
// TIM_TimeBaseStructure.TIM_Period = 99;
// TIM_TimeBaseStructure.TIM_Prescaler = 3199;//中断时间10ms
// TIM_TimeBaseStructure.TIM_ClockDivision = 1;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//
// /* TIM IT enable */
// TIM_ITConfig(TIM4,TIM_IT_Update, ENABLE);
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// /* TIM4 enable counter */
// TIM_Cmd(TIM4, DISABLE);
// /* Enable the TIM4 Interrupt */
//
// NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
//}
////设置TIM4的开关
////sta:0关闭;1,开启;
//void TIM4_Set(unsigned char sta)
//{
// if(sta)
// {
//
// TIM_SetCounter(TIM4,0);//计数器清空
// TIM_Cmd(TIM4, ENABLE); //使能TIMx
// }else TIM_Cmd(TIM4, DISABLE);//关闭定时器2
//}
///**
// * @brief This function handles TIM4 global interrupt request.
// * @param None
// * @retval None
// */
//void TIM4_IRQHandler(void)
//{
// if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
// {
// USART_SDI_RX_STA|=1<<15; //标记接收完成;
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// TIM4_Set(0); //关闭TIM4
//
// }
//}
//串口3,printf 函数
//确保一次发送数据不超过USART1_MAX_SEND_LEN字节