OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2839|回复: 3

串口3 , usart3 3.5库调试 例程

[复制链接]

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2020-5-9 03:21:59 | 显示全部楼层 |阅读模式
我用的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;
}

QQ750273008有好的资料记得发给我哦。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-7-11
在线时间
1 小时
发表于 2020-5-9 03:22:01 | 显示全部楼层
不懂不能装懂啊,只能帮顶。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2020-5-9 03:35:50 | 显示全部楼层
要是编译出错的话,集成块的选项里把complier去掉   ,只保留 CMSIS 和 Device
其他调用路径看下。没问题就能直接编译通过

上传附件说串口3不是重点,重点是库里有 ps2手柄文件,还有 3d打印机 Marlin2.05版本的Gcode代码,有能力的可以更改出来,做个雕刻机什么的。
也可以用ps2手柄上4轴穿越机(要加个9轴模块)

u3新建文件夹.zip

10.89 MB, 下载次数: 20

QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

0

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-9 03:35:53 | 显示全部楼层
路过,学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 06:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表