金牌会员
 
- 积分
- 1635
- 金钱
- 1635
- 注册时间
- 2012-8-28
- 在线时间
- 71 小时
|
我用的f103c8t6的核心板。 这板引脚比较 糙蛋 ;布局改了好几次,考虑到后面上4轴什么的。。。
串口只能用到 串口3 ,晚上把串口3调试出来了,就分享给大家,
也没什么重要的,就串口3的初始化要好好看一下,看不懂也没关系,复制一下就行。方便别人也方便自己。
//PB11 U3_RX
//PB10 U3_TX
#include "usart.h"
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART3->SR&0X40)==0);//循环发送,直到发送完毕
USART3->DR = (u8) ch;
return ch;
}
#endif
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲包,最大USART_REC_LEN个字节.
u32 cuo=0;
//串口初始化 U3
void USART_Configuration(unsigned long UART_baud) //波特率,如115200
{
USART_InitTypeDef USART_InitStructure;//串口参数
NVIC_InitTypeDef NVIC_InitStructure;//中断配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 ,ENABLE);//定时钟源36MHz开
/////////////////////
USART_InitStructure.USART_BaudRate = UART_baud;//波特率115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//校验位 Even偶
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//模式:收发
/////////////////////
USART_Init(USART3,&USART_InitStructure);//基本参数
USART_ITConfig(USART3, USART_IT_RXNE ,ENABLE);//接收中断
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn; //中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //响应优先级 3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);// 初始化 NVIC中断
//USART_WakeUpConfig(USART3, USART_WakeUp_IdleLine );//总线空闲唤醒
USART_Cmd(USART3, ENABLE);
//USART_SendData(USART3, 0x33);//发送测试
}
//U3中断
void USART3_IRQHandler()
{
u8 Res;
// u16 RxData;
// RxData = USART_ReceiveData(USART3);
///////////////
cuo+=USART_GetITStatus(USART3, USART_IT_PE);
cuo+=USART_GetITStatus(USART3, USART_IT_TXE);
cuo+=USART_GetITStatus(USART3, USART_IT_TC );
// cuo+=USART_GetITStatus(USART3,USART_IT_RXNE );//接收中断
cuo+=USART_GetITStatus(USART3,USART_IT_IDLE );
cuo+=USART_GetITStatus(USART3,USART_IT_LBD );
// Res=USART_GetITStatus(USART3,USART_IT_LIN );
cuo+=USART_GetITStatus(USART3,USART_IT_CTS );
cuo+=USART_GetITStatus(USART3,USART_IT_ORE);
cuo+=USART_GetITStatus(USART3,USART_IT_NE);
//USART_IT_PE 奇偶错误中断
//USART_IT_TXE 发送中断
//USART_IT_TC 发送完成中断
//USART_IT_RXNE 接收中断
//USART_IT_IDLE 空闲总线中断
//USART_IT_LBD LIN 中断探测中断
//USART_IT_CTS CTS 中断
//USART_IT_ORE 溢出错误中断
//USART_IT_NE 噪音错误中断
//USART_IT_FE
///////////////
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//确定接收中断 !=0
{
Res =USART_ReceiveData(USART3);//(USART3->DR);//取出数据
////////////////////////
if((USART_RX_STA&1<<15)==0)//接收未完成0x8000 bit15
{
if(USART_RX_STA&1<<14)//0x4000接收到了0x0d bit14
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=(1<<14);//0x4000 bit14
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;//写入缓存包
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
//////////////////////////////////////////
//清除中断
USART_ClearITPendingBit(USART3,USART_WakeUp_IdleLine);//退出本次接收中断
}
}
//主函数中收到数据的处理
u8 usart_main(void)//主函数中收到数据的处理
{
s16 t;
u16 len=0;
if(USART_RX_STA&1<<15)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n失败:%d次,您发送的消息为:",cuo);
for(t=0;t<len;t++)
{
USART3->DR=USART_RX_BUF[t];
while((USART3->SR&0X40)==0);//等待发送结束
}
printf("\r\n");//插入换行
USART_RX_STA=0;//状态复位
return 1;
}
else return 0;
}
|
|