农民讲习所建立通用程序 10 驱动程序设计

串口 驱动模块

C51 串口 硬件

在这里插入图片描述

在这里插入图片描述

TI = 1 表示发送完毕
在这里插入图片描述

RI = 1 表示接收完毕

C51 串口中断

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

移植到 nu-lb-nuc140

//Define MCU Interfaces
#define MCU_INTERFACE_UART1
#define UART_CLOCK_SOURCE_HIRC // HXT, LXT, PLL, HIRC
#define UART_CLOCK_DIVIDER     3
#define PIN_UART1_RX_PB4
#define PIN_UART1_TX_PB5

UART_Open(UART1,115200);  // enable UART1 at 115200 baudrate
UART_ENABLE_INT(UART1, UART_IER_RDA_IE_Msk);
NVIC_EnableIRQ(UART1_IRQn);	
UART_Write(UART1,"Hello Uart1\r\n",13);

void UART1_IRQHandler(void)
{

	//if(UART_IS_RX_READY(UART1)) {		
	//if(UART_IS_TX_EMPTY(UART1)){
	
	//cChar = UART_READ(UART1);
	//UART_WRITE(UART1, cChar);
	//UART_DISABLE_INT(UART1,UART_IER_THRE_IEN_Msk);
	//uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes);	
}

参考代码2 :

void UART1_IRQHandler(void)
{
	
	portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
	
	char cChar;	
	
	uint8_t in_char;
    
	if(UART_IS_RX_READY(UART1)) {		
		
		cChar = UART_READ(UART1);
		//printf("%c",cChar);
		xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
		
	}

	if(UART_IS_TX_EMPTY(UART1)){
	
		/* The interrupt was caused by the THR becoming empty.  Are there any
		more characters to transmit? */
		if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
		{
			/* A character was retrieved from the queue so can be sent to the
			THR now. */			
			UART_WRITE(UART1, cChar);
		}
		else
		{
			UART_DISABLE_INT(UART1,UART_IER_THRE_IEN_Msk);			
		}		
	}
	
	portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
	
}

Nuc140 的 串口 发送完成标志

遇到问题 malloc 失败:

In Hard Fault Handler

r0 = 0x20002eab

r1 = 0x20002eab

r2 = 0x3f400000

r3 = 0xc0d

r12 = 0x0

lr = 0x160d

pc = 0xe9a

psr = 0x61000000

你的arm处理器在启动的时候有个文件是专门配置stack和heap的,吧heap的大小配置成0,这样malloc就无法使用了,也不会浪费内存空间了。

失败的原因是啥呢 ?有空分析一下。

 struct   QueueBuffer
  {
  unsigned char  *aBufferStart;    
  unsigned char  *aBufferEnd;    
  unsigned char   *pIn;        
  unsigned char  *pOut;        
  unsigned char mCount;          
};
	

这个样子会失败,
修改为:

__packed struct   QueueBuffer
  {
  unsigned char  *aBufferStart;    
  unsigned char  *aBufferEnd;    
  unsigned char   *pIn;        
  unsigned char  *pOut;        
  unsigned char mCount;          
};

会成功,具体原因有空分析一下.

测试代码如下:
https://download.csdn.net/download/wowocpp/10775124

Keil 中对齐

4 ARM平台中的对齐

在ARM平台的编译器中,没有提供象“#pragma pack”这么丰富的带参数对齐指令,只有一个关键字“__packed”。

__packed 限定符将所有有效类型的对齐边界设置为 1,如果一个结构没有这个限定符,默认向表数能力最强的那个数据类型对齐。

typedef __packed struct
{
double dValue1;
char u8Value2;
int u32Value3;
} ASampleStructor;

上例中,size值为13,说明1字节对齐后,该结构总长为13字节。去掉__packed对齐后,为16字节。

串口驱动的 可以运行的代码:
https://download.csdn.net/download/wowocpp/10775242

(稍后补充)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值