最近做一个innovation项目时碰到串口接收中断的问题困扰了好久,终于找到知道原因了。项目用到的芯片是NXPMPC5607B,与一个指纹模块通过串口进行数据传输。在已有的Autosar架构的项目的代码中加入指纹模块代码,另外需要对串口进行正确的配置,才能完成最终的功能。串口接收中断

根据解读芯片手册,配置串口需要先配置SUI端口,PCTL寄存器,然后配置Linflex相关寄存器。因为这款芯片,串口UART和LIN是结合在一起的,因此配置时需要设置UART模式,然后配置波特率等。直接附上串口配置代码:

void LINFlex1_init(uint16_t baudrate)
{ME.PCTL[49].R = 0x00;//Configure the input/output TX RXSIU.PCR[38].R = 0x0600;    // Setting PC[6] as LINFlex_1.TxDASIU.PCR[39].R = 0x0101;    // Setting PC[7] as LINFlex_1.RxDA, pull upSIU.PSMI[55].B.PADSEL = 0x00; // set PADSEL PC[7] to RXD//Configure LINFlex1LINFLEX_1.LINCR1.B.INIT   = 1;   // request initlizationLINFLEX_1.LINCR1.B.SLEEP  = 0;  // disable the sleep modeLINFLEX_1.LINCR1.B.BF     = 1;  // if Identifier is not comparison with any filter,  generate interruptLINFLEX_1.UARTCR.B.UART   = 1;        // enter UART modeLINFLEX_1.UARTCR.B.WL     = 1;        // 8 bit data//LINFLEX_1.UARTCR.B.OP     = 1;      // even parityLINFLEX_1.UARTCR.B.PCE    = 0;  // disable odd and even parityLINFLEX_1.UARTCR.B.TDFL   = 0;        // send buffer is only 1 byteLINFLEX_1.UARTCR.B.RDFL   = 0;        // receive buffer is only 1 byteLINFLEX_1.UARTCR.B.RXEN   = 1;   // enable receiveLINFLEX_1.UARTCR.B.TXEN   = 1;   // enable transmit//WKUP.WISR.R = 0x00001000;  // setting the wake up event for LINRX1//WKUP.WRE.R = 0x00000000;  //disable the LINRX1 wakeup requestswitch (baudrate){case 9600:{//baudrate 9600LINFLEX_1.LINIBRR.B.DIV_M = 833;      // Baud Rate = 9600, In Case fipg_clock_lin = 64 MHzLINFLEX_1.LINFBRR.B.DIV_F = 5;       // Baud Rate = 9600, In Case fipg_clock_lin = 64 MHz}break;case 19200:{//baudrate 19200LINFLEX_1.LINIBRR.B.DIV_M = 416;     // Baud Rate = 19200, In Case fipg_clock_lin = 64 MHzLINFLEX_1.LINFBRR.B.DIV_F = 11;       // Baud Rate = 19200, In Case fipg_clock_lin = 64 MHz}break;case 38400:{//baundrate 38400LINFLEX_1.LINIBRR.B.DIV_M = 208;     // Baud Rate = 38400, In Case fipg_clock_lin = 64 MHzLINFLEX_1.LINFBRR.B.DIV_F = 5;       // Baud Rate = 38400, In Case fipg_clock_lin = 64 MHz}break;case 57600:{//baundrate 57600LINFLEX_1.LINIBRR.B.DIV_M = 138;      // Baud Rate = 57600, In Case fipg_clock_lin = 64 MHzLINFLEX_1.LINFBRR.B.DIV_F = 14;       // Baud Rate = 57600, In Case fipg_clock_lin = 64 MHz}break;case 115200:{//baundrate 115200LINFLEX_1.LINIBRR.B.DIV_M = 69;       // Baud Rate = 19200, In Case fipg_clock_lin = 64 MHzLINFLEX_1.LINFBRR.B.DIV_F = 7;       // Baud Rate = 19200, In Case fipg_clock_lin = 64 MHz}break;default:{//baundrate 57600LINFLEX_1.LINIBRR.B.DIV_M = 138;       // Baud Rate = 57600, In Case fipg_clock_lin = 64 MHzLINFLEX_1.LINFBRR.B.DIV_F = 14;       // Baud Rate = 57600, In Case fipg_clock_lin = 64 MHz}break;}LINFLEX_1.LINIER.B.DRIE   = 1;   // enable the receive interruptLINFLEX_1.UARTSR.B.DRF    = 1;        // clear the receive data complete flagLINFLEX_1.UARTSR.B.DTF    = 1;        // clear the transmit data complete flag//INTC.PSR[99].R = 0x01;                // set the interrupt priority as 1LINFLEX_1.LINCR1.B.INIT   = 0;  // change to normal mode
}

串口初始化结束后,接着是编写中断函数,中断函数非常简单,就是从寄存器中读取接受的数据存到一个数据缓存arrar_uart[]中,接收完需要清除接收完成标志位DRF。

void UART1_ISRfunc(void)
{arrar_uart[length_uart++] = (uint8_t)LINFLEX_1.BDRM.R;LINFLEX_1.UARTSR.B.DRF = 1;
}

中断函数编写完后,需要配置串口函数在中断向量表中的入口地址。设置如下:

__asm("    e_lis  r0,%hi( UART1_ISR_cat2c)");
__asm("    e_or2i       r0,%lo( UART1_ISR_cat2c)");

设置中断函数的入口地址,由于中断函数在osek任务调度同一管理,下面的UART1_ISR_cat2c即是osek中的中断函数,此处可以直接替换成中断函数UART1_ISRfunc。

尤其要注意的是设置中断优先级的这段

__asm("   e_add16i   r31, r31, 26");     /* prio 1 for UART1_ISR */
   __asm("   e_add16i   r30, r30, 0");
   __asm("   e_stb    r30, 0(r31)");

否则中断会被其他的中断抢占,而导致进不了中断函数,在调试过程中,之前代码没有设置优先级,从而导致中断函数一直进不去。

MPC5607B串口接收中断程序相关推荐

  1. 串口接收中断配置过程---STM32F4--HAL

    串口接收中断程序配置过程(HAL) 初始化相关参数,使能串口: HAL_UART_Init(); 该函数的参数是串口的基址,在stm32f429xx.h文件中,定义了8个UART_HandleType ...

  2. STM32 串口接收流程-串口接收中断

    串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长. 编程USARTx_CR2的STOP位来定义停止位位数. 编程USARTx_BRR寄存器确定波特率. 使能USARTx_CR1的UE位 ...

  3. STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序

    1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...

  4. Linux:TTY串口接收中断

    Linux的串口接收中断一般都是使能的,无论是否是DMA接收. 当串口接收到数据的时候,会调用 stm32_usart_push_buffer_dma函数.在这个函数内部向用户层发送信号,然后就可以调 ...

  5. HC06蓝牙2.0模块连接不稳定 和 STM32串口不传输数据(串口接收中断)的一些问题

    HC06蓝牙2.0模块连接不稳定和STM32串口不传输数据(串口接收中断)的一些问题(推荐) 1.蓝牙 最近,在一个项目中使用到蓝牙,但是调试过程出现了很多问题. 刚开始使用的是HC06蓝牙,刚开始使 ...

  6. avr模拟串口通讯c语言,AVR简单的串口通信程序

    本例子是学习AVR的串口通信时候编写的一个简单的串口通信的程序,运行的时候先向串口发送一个数据0x12,然后等待接收,当PC机发送一个数据到单片机,单片机就对这个数据进行加1处理,然后发回到PC机显示 ...

  7. STC15F2K60S2单片机的串口通信程序及相关知识

    一.STC15F2K60S2单片机简介 中国深圳宏晶STC系列单片机是2005年推出中国本土的第一款具有全球竞争力的,且与MCS-51兼容的STC系列单片机.它完全兼容51单片机,是新一代增强型单片机 ...

  8. 基于Atmega8单片机的串口收发程序

    Atmega8出厂默认的内部时钟频率是1Mhz,做串口收发时波特率最高设置为4800,设置为9600会乱码,提高时钟频率才能将波特率提高. #include <avr/io.h> #inc ...

  9. 简单的串口助手程序开发

    1.简介 之前在烽火集团实习的时候,开发串口通信程序用的都是纯C++.感觉串口程序开发很考验人的逻辑思考能力.不过,现在好了,科研工作中,一切已存在的"利器"都可以用来为自己的&q ...

  10. 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?...

    ====================问题描述==================== RT:基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activ ...

最新文章

  1. tensorrt轻松部署高性能dnn推理_NVIDIA Triton推理服务器助力深度学习推理
  2. 连SEO优化师都难以收集的搜索引擎规则,在这里!
  3. Servlet基础(一) Servlet基础和关键的API介绍
  4. MongoDB入门_MongoDB安装与配置
  5. Python格式化输出方法
  6. 第二代计算机网络主要贡献,2010级计算机网络试题
  7. win10 dcom服务器进程占用cpu,WIN10CPU百分百,Windows10 DCOM占用过高解决办法 | 帮助信息-动天数据...
  8. 猎豹MFC--CFile类家族介绍ADO连接数据库 打开数据库 关闭数据库 连接字符串
  9. mysql查询多造一列_mysql某列多值查询_MySQL
  10. 20155210 网络攻防技术 实验三 免杀原理与实践
  11. 卸载sqlserver2012
  12. 各类木材强度_常用木材分类
  13. 文件压缩(哈夫曼树)
  14. Codeforces--1311A--Duff and Weight Lifting
  15. PNG图像转ICO的方法
  16. 什么是数据工程师,数据工程师主要是做什么的?
  17. 换钱计划调用函数c语言编程,CCF NOI1034 钞票兑换
  18. ARM的商业模式和ARM各种版本号区分
  19. 软件版权申请流程有哪些
  20. windows2008 配置java_Windows server 2008 R2 安装Java环境

热门文章

  1. 有利网2022最新兑付消息,开展部分债务资金清退
  2. UEFI开发学习3 - 创建UEFI程序
  3. Java8新特性(二)流式处理
  4. 数据三等分离散python_数据自习室01-描述性统计量
  5. 【Cesium】加载互联网地图服务——高德地图
  6. VUE前端应用部署页面访问404问题
  7. java拦截通过url访问页面,必须通过登录页面访问目标页面
  8. python头像截取_身份证头像截取 - osc_8plez0fy的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. iphone计算机怎么显示电话,苹果手机最近通话记录不显示怎么恢复
  10. MPB:使用QIIME 2分析微生物组16S rRNA基因扩增子测序数据(视频)