MPC5607B串口接收中断程序
最近做一个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串口接收中断程序相关推荐
- 串口接收中断配置过程---STM32F4--HAL
串口接收中断程序配置过程(HAL) 初始化相关参数,使能串口: HAL_UART_Init(); 该函数的参数是串口的基址,在stm32f429xx.h文件中,定义了8个UART_HandleType ...
- STM32 串口接收流程-串口接收中断
串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长. 编程USARTx_CR2的STOP位来定义停止位位数. 编程USARTx_BRR寄存器确定波特率. 使能USARTx_CR1的UE位 ...
- STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序
1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...
- Linux:TTY串口接收中断
Linux的串口接收中断一般都是使能的,无论是否是DMA接收. 当串口接收到数据的时候,会调用 stm32_usart_push_buffer_dma函数.在这个函数内部向用户层发送信号,然后就可以调 ...
- HC06蓝牙2.0模块连接不稳定 和 STM32串口不传输数据(串口接收中断)的一些问题
HC06蓝牙2.0模块连接不稳定和STM32串口不传输数据(串口接收中断)的一些问题(推荐) 1.蓝牙 最近,在一个项目中使用到蓝牙,但是调试过程出现了很多问题. 刚开始使用的是HC06蓝牙,刚开始使 ...
- avr模拟串口通讯c语言,AVR简单的串口通信程序
本例子是学习AVR的串口通信时候编写的一个简单的串口通信的程序,运行的时候先向串口发送一个数据0x12,然后等待接收,当PC机发送一个数据到单片机,单片机就对这个数据进行加1处理,然后发回到PC机显示 ...
- STC15F2K60S2单片机的串口通信程序及相关知识
一.STC15F2K60S2单片机简介 中国深圳宏晶STC系列单片机是2005年推出中国本土的第一款具有全球竞争力的,且与MCS-51兼容的STC系列单片机.它完全兼容51单片机,是新一代增强型单片机 ...
- 基于Atmega8单片机的串口收发程序
Atmega8出厂默认的内部时钟频率是1Mhz,做串口收发时波特率最高设置为4800,设置为9600会乱码,提高时钟频率才能将波特率提高. #include <avr/io.h> #inc ...
- 简单的串口助手程序开发
1.简介 之前在烽火集团实习的时候,开发串口通信程序用的都是纯C++.感觉串口程序开发很考验人的逻辑思考能力.不过,现在好了,科研工作中,一切已存在的"利器"都可以用来为自己的&q ...
- 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?...
====================问题描述==================== RT:基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activ ...
最新文章
- tensorrt轻松部署高性能dnn推理_NVIDIA Triton推理服务器助力深度学习推理
- 连SEO优化师都难以收集的搜索引擎规则,在这里!
- Servlet基础(一) Servlet基础和关键的API介绍
- MongoDB入门_MongoDB安装与配置
- Python格式化输出方法
- 第二代计算机网络主要贡献,2010级计算机网络试题
- win10 dcom服务器进程占用cpu,WIN10CPU百分百,Windows10 DCOM占用过高解决办法 | 帮助信息-动天数据...
- 猎豹MFC--CFile类家族介绍ADO连接数据库 打开数据库 关闭数据库 连接字符串
- mysql查询多造一列_mysql某列多值查询_MySQL
- 20155210 网络攻防技术 实验三 免杀原理与实践
- 卸载sqlserver2012
- 各类木材强度_常用木材分类
- 文件压缩(哈夫曼树)
- Codeforces--1311A--Duff and Weight Lifting
- PNG图像转ICO的方法
- 什么是数据工程师,数据工程师主要是做什么的?
- 换钱计划调用函数c语言编程,CCF NOI1034 钞票兑换
- ARM的商业模式和ARM各种版本号区分
- 软件版权申请流程有哪些
- windows2008 配置java_Windows server 2008 R2 安装Java环境
热门文章
- 有利网2022最新兑付消息,开展部分债务资金清退
- UEFI开发学习3 - 创建UEFI程序
- Java8新特性(二)流式处理
- 数据三等分离散python_数据自习室01-描述性统计量
- 【Cesium】加载互联网地图服务——高德地图
- VUE前端应用部署页面访问404问题
- java拦截通过url访问页面,必须通过登录页面访问目标页面
- python头像截取_身份证头像截取 - osc_8plez0fy的个人空间 - OSCHINA - 中文开源技术交流社区...
- iphone计算机怎么显示电话,苹果手机最近通话记录不显示怎么恢复
- MPB:使用QIIME 2分析微生物组16S rRNA基因扩增子测序数据(视频)