历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2020年04月22日 | 32位单片机PIC32MX270F256B设置UART的两种方法

2020-04-22 来源:eefocus

开发IDE:MPLAB X 5.25

下载/DEBUG工具:MPLAB ICD 3/PICKIT 3

MCU:PIC32MX270F256B

编译器:XC32 V2.30

晶振:外部晶振4M,system pll 倍频到48M作为sys clock

首先是库函数方法配置UART1


#include "UART.h"

void UART1_Init() 

{

    //关联引脚

    U1MODEbits.STSEL = 0; //1 STOP BIT

    U1MODEbits.PDSEL = 0; //00 = 8 位数据,无奇偶校验

    U1MODEbits.BRGH = 0; //0 = 标准速度模式—— 使能16 倍波特率时钟  1 = 高速模式—— 使能4 倍波特率时钟

    U1MODEbits.ABAUD=0; //禁止波特率测量

    U1MODEbits.UEN=0b00;//00 = 使能并使用UxTX 和UxRX 引脚; UxCTS 和UxRTS/UxBCLK 引脚由PORTx 寄存器中的相应位控制

    U1STAbits.UTXEN = 1; //UTXEN:发送使能位

    U1BRG = 38; //9600

    //pbclk=sysclk/8=48/8=6M

    //UxBRG=PBCLK/(16 ×波特率)-1

  // NTCON1bits.NSTDIS = 0; //   NSTDIS: 中断嵌套禁止位  

    IEC1bits.U1RXIE=1;//UART1 接收器中断允许位 ,见pic32mx1xx2xx——44xlp page66

    IPC8bits.U1IP = 0b010; //记于2019年11月18日,优先级只能设为2,一开始设为111.最高优先级,进不去中断,很奇怪,设置为2就能近中断,血的教训

    //IPC8:中断优先级控制寄存器8,U1RXIP<2:0>:UART1 接收器中断优先级位 111 = 中断优先级为7 (最高优先级中断)

    IPC8bits.U1IS = 0b00; //IPC8:中断次级优先级控制寄存器 

    U1STAbits.URXISEL = 0; //当接收到一个字符时,中断标志位置1 ;且UxRSR 的内容被传输给接收缓冲器。接收缓冲器有一个或多个字符。 

    U1STAbits.OERR = 0; //CLEAR   接收缓冲器   

    //IFS1bits.U1RXIF=0;//复位接收中断标志位

    U1STAbits.URXEN = 1; //接收使能位

    U1MODEbits.ON = 1; //1 = 使能UARTx 模块。UARTx 引脚由UARTx 根据UEN<1:0> 和UTXEN 控制位的定义控制

    U1MODEbits.UARTEN=1;

   

}


或者用库函数初始化UART1,此方法和上面方法等效


void UART1_Init_By_Lib()

{

     //UART1模块初始化:配置为串口通信、8位数据、1位停止、无校验、仅用TX和RX引脚...等

    UARTConfigure(UART_MODULE_ID, UART_ENABLE_PINS_TX_RX_ONLY);

    UARTSetFifoMode(UART_MODULE_ID, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);

    UARTSetLineControl(UART_MODULE_ID, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);

    UARTSetDataRate(UART_MODULE_ID, GetPeripheralClock(), DESIRED_BAUDRATE);

    UARTEnable(UART_MODULE_ID, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));


    //UART1中断配置

    INTEnable(INT_SOURCE_UART_RX(UART_MODULE_ID), INT_ENABLED);

    INTSetVectorPriority(INT_VECTOR_UART(UART_MODULE_ID), INT_PRIORITY_LEVEL_2);

    INTSetVectorSubPriority(INT_VECTOR_UART(UART_MODULE_ID), INT_SUB_PRIORITY_LEVEL_0);

 

}


接下来是发送一个char和一段字符串的函数


void UART1_SendData(char dat) 

{

    while (U1STAbits.TRMT!=1) 

    {

        ; //wait!!!if MCU is sending data

    }

    U1TXREG = dat;

}


void UART1_SendBuf(char *buff, uint num) {

    unsigned int i = 0;

    while (i < num) {

        UART1_SendData(buff[i]); //Send the current char

        i++;

    }

}


UART1的接收中断,以下中断函数放在main.c,否则报error


void __ISR(_UART_1_VECTOR, IPL2AUTO) IntUart1Handler(void) 

{

    //如果是接收中断

    if (INTGetFlag(INT_SOURCE_UART_RX(UART_MODULE_ID))) {

        int i;

        BYTE t;

        t = UARTGetDataByte(UART_MODULE_ID);

        

        // PORTClearBits(IOPORT_B, BIT_5);

        

        UART1_SendData(t); //回传数据

        

        // Clear the RX interrupt Flag

        INTClearFlag(INT_SOURCE_UART_RX(UART_MODULE_ID));

        //PORTSetBits(IOPORT_B, BIT_5);

       

    }

    // We don't care about TX interrupt

    if (INTGetFlag(INT_SOURCE_UART_TX(UART_MODULE_ID))) 

    {

        INTClearFlag(INT_SOURCE_UART_TX(UART_MODULE_ID));

    }

}


最后附上我的UART.h


#ifndef UART_H

#define UART_H

#include "global.h"

void UART1_Init();

void UART1_Init_By_Lib();

void UART1_SendData(char dat) ;

void UART1_SendBuf(char *buff,uint num);

//void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt();

#endif /* UART_H */


经验总结:pic32网上参考代码并不多,代码调不出来时,可以多认真看datasheet,在调试单片机的代码时,善用数字示波器和逻辑分析仪,有奇效。

推荐阅读

史海拾趣

Custom Components Inc公司的发展小趣事

在CCI的发展历程中,人才培养和团队建设始终是公司发展的重要保障。公司注重员工的个人成长和职业发展,为员工提供多样化的培训和发展机会。

同时,CCI还建立了完善的激励机制和福利制度,激发员工的工作热情和创造力。通过加强团队合作和文化建设等方式,公司营造了一个积极向上、充满活力的工作氛围。这种良好的团队氛围不仅提高了员工的工作效率和满意度,也为公司的持续发展提供了有力的人才保障。

Bivar公司的发展小趣事

随着环保意识的日益增强,电子行业对绿色环保的要求也越来越高。Bivar公司积极响应这一趋势,投入大量资源进行环保技术的研发和应用。公司推出了一系列绿色环保的电子产品,如低能耗、无毒害的电阻器和电容器等。这些产品不仅符合了市场需求,还为公司树立了良好的环保形象。

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

EFC公司始终坚持“品质至上”的原则。他们严格控制原材料采购,确保每一批材料都符合最高标准。在生产过程中,EFC采用先进的生产设备和工艺,确保产品的稳定性和可靠性。此外,公司还建立了完善的质量检测体系,对每一个出厂的产品都进行严格的检测。正是这种对品质的执着追求,让EFC的产品在市场上赢得了良好的口碑。

Ampire Co Ltd公司的发展小趣事

EFC公司始终坚持“品质至上”的原则。他们严格控制原材料采购,确保每一批材料都符合最高标准。在生产过程中,EFC采用先进的生产设备和工艺,确保产品的稳定性和可靠性。此外,公司还建立了完善的质量检测体系,对每一个出厂的产品都进行严格的检测。正是这种对品质的执着追求,让EFC的产品在市场上赢得了良好的口碑。

Cornerstone Sensors公司的发展小趣事

Cornerstone Sensors一直致力于技术创新和产品升级。公司不断投入研发资源,探索传感器技术的新应用和新领域。例如,公司率先推出了具有自校准功能的智能传感器,大大提高了产品的使用便捷性和准确性。此外,Cornerstone Sensors还积极探索物联网、人工智能等新兴技术与传感器的结合点,为行业发展注入了新的活力。

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

Cornerstone Sensors公司成立于电子行业的蓬勃发展时期。创立初期,公司就明确了以传感器技术为核心的发展方向。公司聚集了一批优秀的工程师和科学家,致力于研发高精度、高稳定性的传感器产品。经过数年的技术积累和产品研发,Cornerstone Sensors逐渐在传感器领域崭露头角,其产品质量和技术水平得到了行业的广泛认可。

问答坊 | AI 解惑

09清单中的变压器很奇怪 没见过

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 额定功率50W,3个绕组变比n1:n2:n3=20:10:1,电流依次为I1=1.5A、I2=3A、I3=0.1A,为何是最后一个是0.1A?  …

查看全部问答>

反激式电源中电磁干扰及其抑制

摘  要 : 在 介 绍 Flyback反 激 式 DC/DC 电 源 及 其 性 能 的 基 础 上 ,  主 要 讨 论 了 该 电 源 中 的 网 侧 谐 波 及 其 抑 制 ,  开 关缓 冲 电 路 , 光 耦 隔 离 等 问 题 。…

查看全部问答>

sqlite移植wince

我想在pda上用SQLite数据库,我程序是qt写的,但是我应该怎样将SQLite移植到wince平台上呢,我现在有了SQLite.dll和SQLite.lib,之后我交叉编译生成了.exe文件,为什么在模拟器上不能运行呢?…

查看全部问答>

《走过路过,千万不要错过》 定时器中断 动态扫描 。单步可以。一执行 就有问题。。

  ORG  0000H         LJMP MAIN         ORG  000BH         LJMP TIMER0        &nbs ...…

查看全部问答>

STC各系列单片机 型号命名规则

STC各系列单片机 型号命名规则 12 C LE 20 52 AD 后缀意思_含义…

查看全部问答>

单片机学习该怎么入手?

我是大一的学生,已经学过一下单片机,想利用暑假的时间来深入学习下单片机的开发,上网买了个开发板,具体怎么做才能学到真正的东西?求各位大神指给小弟一条正确的道路,,,谢谢! -----------没伞的孩纸必须学会努力向前奔跑!…

查看全部问答>

全新MSP430FR5969 LaunchPad Evaluation Kit 不带屏幕

本帖最后由 dai277530706 于 2014-8-17 21:30 编辑 之前ti搞活动六折卖的开发板,后来论坛搞活动又送了一块,还没有拆封。现在想把买来的卖出去。90元不包邮。有意联系QQ:277530706 …

查看全部问答>

重新认识TL431

熟悉电路制作的人大多对TL431并不陌生。由于TL431的动态抗阻的特性,其经常在电路设计当中被用于替代稳压二极管。不仅如此,TL431的开态响应速度快输出噪音低,并且价格低廉。因此收到了了电源工程师和初学者们大力好评。本篇文章主要为大家介绍了T ...…

查看全部问答>

【Altera soc 体验之旅】+基于自组网的无线路由设计在FPGA-SOC上的实现

                                      基于自组网的无线路由设计在FPGA-SOC上的实现     首先 ...…

查看全部问答>

新手关于CCS路径的问题

本帖最后由 无知的萝卜 于 2015-9-17 13:33 编辑 我自己新建了一个project。 里面有个h文件 firstTry.h。(firstTry.h的位置在F:\\CCS\\WorkSpace\\MyFirstTry\\Header)开始的时候我的路径设置为 编译报错无法打开firstTry.h 后来我把firstTry. ...…

查看全部问答>