求助,hal库函数 下载串口中断接收,急急急,加入悬赏

导读:——协议栈中的串口操作ZigBee学习之4242——,如果要使用协议栈中提供的串口,首先初始化串口,在函数中初始化串口,会调用Hal_ProcessPoll()来读取时间和串口,//来看下串口poll函数,因为我的开发板使用这个串口,//当发生串口接收中断时cfg0就会改变,如果串口没有数据输入cfg0为空,当接收到数据时cfg0将在串口中断服务程序中被改变,//如果串口没有接收到数据,也就是
——协议栈中的串口操作ZigBee学习之4242——
如果要使用协议栈中提供的串口,则需要定义HAL_UART和HAL_UARTTRUE【hal_board_cfg.h】。首先初始化串口,在主函数中调用HalDriverInit()时,在函数中初始化串口,主要是配置管脚和DMA通道。然后在osal_start_system()开始系统后,会调用Hal_ProcessPoll()来读取时间和串口,
voidHal_ProcessPoll()
HalTimerTick();
#if(definedHAL_UART)&&(HAL_UART==TRUE)
HalUARTPoll();
//来看下串口poll函数,我们只看UART0的,因为我的开发板使用这个串口
voidHalUARTPoll(void)
#if(HAL_UART_0_ENABLE|HAL_UART_1_ENABLE)
staticuint8tickS
uartCfg_t*
#ifHAL_UART_0_ENABLE
//当发生串口接收中断时cfg0就会改变,如果串口没有数据输入cfg0为空,当接收到数据时cfg0将在串口中断服务程序中被改变
//UsetheLSBofthesleeptimer(ST0mustbereadfirstanyway).
//系统上电后,睡眠定时器就会自动启动做自增计数ST0即睡眠定时器启动到现在计算值的最低8位
tick=ST0-tickS
tickShdw=ST0;
//要注意接下来的是个循环
if(cfg-&txTick&tick)
cfg-&txTick-=
cfg-&txTick=0;
if(cfg-&rxTick&tick)
cfg-&rxTick-=
cfg-&rxTick=0;
//是使用DMA方式还是使用中断方式
#ifHAL_UART_ISR
#ifHAL_UART_DMA
if(cfg-&flag&UART_CFG_DMA)
pollDMA(cfg);
pollISR(cfg);
//中断方式
staticvoidpollISR(uartCfg_t*cfg)
//如果串口没有接收到数据,也就是说没有发生过串口接收中断,那么cfg应为是为空的,则cnt=0
//如果发生了串口中断,则cnt计算出串口缓存中还有多少数据没有读出,这个缓存并不是硬件寄存器的缓存,而是程序中开辟一段空间
uint8cnt=UART_RX_AVAIL(cfg);
if(!(cfg-&flag&UART_CFG_RXF))
//这里是针对流控制的,如果又有新的数据接收到了那么就要重置超时时间(超时
时间由睡眠定时器来控制),而且需要把已经读出的数据数目减去!
//Ifanythingreceived,resettheRxidletimer.
if(cfg-&rxCnt!=cnt)
cfg-&rxTick=HAL_UART_RX_IDLE;
cfg-&rxCnt=
/*ItisnecessarytostopRxflowinadvanceofafullRxbufferbecause
*bytescankeepcomingwhilesendingH/Wfifoflushes.
//当接收缓存超过安全界限的时候停止RX流
if(cfg-&rxCnt&=(cfg-&rxMax-SAFE_RX_MIN))
RX_STOP_FLOW(cfg);
//关于安全界限,在程序中有下面一段:
/*NeedtoleaveenoughoftheRxbufferfreetohandletheincoming
*afterassertingflowcontrol,butbeforethetransmitterhasobeyedit.
*Atthemaxexpectedbaudrateof115.2k,16byteswillonlytake~1.
*butattheminexpectedbaudrateof38.4k,theycouldtake~4.2m
*SAFE_RX_MINandDMA_RX_DLYmustbothbeconsistentaccordingt
*themin&maxexpectedbaudrate.
//如果声明了流控制,为保证数据的正确接收需要在RX缓存区中预留出足够的空
间。CC2430可以使用的最大串口波特率为115.2k。这个安全界限的数字跟使用
的波特率还有串口tick有关。
#if!defined(SAFE_RX_MIN)
#defineSAFE_RX_MIN48//bytes-maxexpectedperpoll@115.2k
//16bytes@38.4kBaud-&4.16msecs-&13832-kHzticks.
#defineDMA_RX_DLY140
//2bytes@38.4kBaud-&0.52msecs-&1732-kHzticks.
#defineDMA_TX_DLY20
//超时计数利用的是睡眠定时器,而睡眠定时器是以32Khz时钟计数的,所以1
微妙约为33个计数值(如果使用外部32.768KHz晶振)
//Thetimeouttickisat32-kHz,somultiplymsecsby33.
#defineRX_MSECS_TO_TICKS33
//超时时间设为传输一个字节的时间,之所以是6而不是8我觉得是排除掉串口
协议中的停止位和起始位的结果
//Thetimeoutonlysupports1byte.
#if!defined(HAL_UART_RX_IDLE)
#defineHAL_UART_RX_IDLE(6*RX_MSECS_TO_TICKS)
#elifHAL_UART_DMA
pollDMA(cfg);
/*Thefollowinglogicmakescontinuouscallbacksonanyeligibleflag
*untiltheconditioncorrespondingtotheflagisrectified.
*Soevenifnewdataisnotreceived,continuouscallbacksaremade.
if(cfg-&rxHead!=cfg-&rxTail)
//如果接收缓存中有数据,当接收数据时rxHead会增计数,当读取数据时rxTail会增计数,两个标志的初始值都为0,所以这两个标志的差值就指示了缓存中有多少的数据
if(cfg-&rxHead&=(cfg-&rxMax-SAFE_RX_MIN))
//已保存的数据已经超过了安全界限,发送接收满事件
evt=HAL_UART_RX_FULL;
elseif(cfg-&rxHigh&&(cfg-&rxHead&=cfg-&rxHigh))
evt=HAL_UART_RX_ABOUT_FULL;
elseif(cfg-&rxTick==0)
//超时事件
evt=HAL_UART_RX_TIMEOUT;
//如果发生事件,并且配置了回调函数则调用回调函数
if(evt&&cfg-&rxCB)
cfg-&rxCB(((cfg-&flag&UART_CFG_U1F)!=0),evt);
//(cfg-&flag&UART_CFG_U1F)!=0)判读是那个串口,如果是串口1则为1,否则为0}
//下面的没看懂,下面的判断好像是没有用一样,不管是哪个条件都break了!
if(cfg==cfg0)
}while(TRUE);
就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    BLE 协议栈 之串口收发
BLE 协议栈 之串口收发
[摘要:曾曾的一篇闭于串心支收的专客,是间接应用串心中缀支收的,固然如许完成了支收功效,然则对大批数据传收的时间,便会涌现数据支收没有实时的环境,偶然间发明了一种更加]
&&&& 曾经曾经的一篇关于串口收发的博客,是直接使用串口中断收发的,虽然这样实现了收发功能,但是对于大量数据传送的时候,就会出现数据收发不及时的情况,无意间发现了一种更为简单的方式,十分方便快捷~
&&&&& BLE协议栈中对于串口收发已经封装的很彻底了,主要的函数都在NPI.c 实现了,只要调用就可以了。当然串口的配置是在NPI_InitTransport函数中,改变相应的配置是在NPI.h中。
&&& 硬件原因,所以串口使用的是uart 0 (alt.2)& 收发引脚在P1.4 和P1.5 上,所以初始化的时候需要进行一些修改。
HAL_UART=TRUE&
去掉电源管理定义 :xPOWER_SAVING
&在SimpleBLECentral_Init中进行初始化:
/************* uart init ************************************/
NPI_InitTransport(NpiSerialCallback);
PERCFG = 0x01;
//位置1 P1口
P1SEL = 0x30;
//P1_4,P1_5用作串口(外部设备功能)
U0CSR |= 0x80;
//设置为UART方式
NPI_WriteTransport(&Hello Worldn&,12);
/**************************************************************/
如果只需要发送功能可以将NpiSerialCallback改成NULL
NpiSerialCallback是串口接收回调函数 在NPI_InitTransport调用 简单的可以看做中断处理函数就可以了,顺便说一句,BLE将以前左右的中断函数变成了event事件,处理中断时,只要做出相应事件判断,然后清除事件触发标志,再处理就行了。
回调函数,将接收的字节,再发送出去!
/***********************
uart call back
**********************************************/
static void NpiSerialCallback( uint8 port, uint8 events )
uint8 numBytes = 0;
uint8 buf[128];
if (events & HAL_UART_RX_TIMEOUT)
//串口有数据
numBytes = NPI_RxBufLen();
//读出串口缓冲区有多少字节
if(numBytes)
//从串口缓冲区读出numBytes字节数据
NPI_ReadTransport(buf,numBytes);
//把串口接收到的数据再打印出来
NPI_WriteTransport(buf,numBytes);
/**************************************************************************************/
接收中断触发事件:
/* UART Events */
#define HAL_UART_RX_FULL&&&&&&&& 0x01
#define HAL_UART_RX_ABOUT_FULL&& 0x02
#define HAL_UART_RX_TIMEOUT&&&&& 0x04
#define HAL_UART_TX_FULL&&&&&&&& 0x08
#define HAL_UART_TX_EMPTY&&&&&&& 0x10
添加LCD& 显示:
添加宏定义:
LCD_TO_UART
在Hal_LCD.h 的HalLcdWriteString 函数中添加
#ifdef LCD_TO_UART
NPI_WriteTransport ( (uint8*)str,osal_strlen(str));
NPI_WriteTransport (&n&,1);
并添加头文件:
#ifdef LCD_TO_UART
#include &npi.h&
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
IThao123周刊转:HAL库串口接收中断函数的一种使用方法 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
转:HAL库串口接收中断函数的一种使用方法
16:34:31  
用过HAL库的坛友想必对串口接收中断函数
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
中的 参数 uint16_t Size 深恶痛绝,我看到这个函数心里就在想,我又不知道我可能接收到多少数目的字符串,这个参数怎么给,因此通常情况下,我都是用的阻塞接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
最近想到一种思路(借鉴原子的思路),不仅可以使用串口接收中断函数,还可以通过结尾为 0x0d 0x0a(即回车换行)判断接收结束
每次中断接收一个字符,
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){& && &&&if(huart == &huart6)& && &&&{& && && && && & if((USART_RX_STA&0x8000)==0)//接收未完成& && && && && & {& && && && && && && && &if(USART_RX_STA&0x4000)//接收到0x0d& && && && && && && && &{& && && && && && && && && && &&&if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]!=0x0a)USART_RX_STA=0;//接收错误,重新开始& && && && && && && && && && &&&else& && && && && && && && && && &&&{& && && && && && && && && && && && && & USART_RX_STA|=0x8000;& && &&&//接收完成& && && && && && && && && && &&&}& && && && && && && && &}& && && && && && && && &else //还没收到0x0d& && && && && && && && &{& && && && && && && && && && &&&if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]==0x0d)& && && && && && && && && && &&&{& && && && && && && && && && && && && & USART_RX_STA|=0x4000;& && && && && && && && && && && && && & USART_RX_STA++;& && && && && && && && && && && && && & HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);& && && && && && && && && && &&&}& && && && && && && && && && &&&else& && && && && && && && && && &&&{& && && && && && && && && && && && && & USART_RX_STA++;& && && && && && && && && && && && && & if(USART_RX_STA&(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始& && && && && && && && && && && && && & HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);& && && && && && && && && && &&&}& && && && && && && && &}& && && && && & }& && &&&}}
[color=rgb(51, 102, 153) !important]复制代码
uint8_t cc2541_rx_at_buff[USART_REC_LEN];//接收状态//bit15&&接收完成标志//bit14&&接收到0x0d//bit13&&接收到有效字节数目uint16_t USART_RX_STA=0;& && & //接收状态标记
[color=rgb(51, 102, 153) !important]复制代码
#define USART_REC_LEN& && && && && && && && &&&200& && && & //定义最大接收字节数
[color=rgb(51, 102, 153) !important]复制代码
在主函数里面,就可以这样写
HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[0],1);while( (USART_RX_STA & 0x8000) == 0);//自己的代码//& && &&&uint8_t i=0;& && &&&for(i=0;i& (USART_RX_STA & 0x3FFF); i++)& && && && && & cc2541_rx_at_buff = '\0';& && &&&USART_RX_STA = 0;
[color=rgb(51, 102, 153) !important]复制代码
Powered by查看: 11703|回复: 65
ST的HAL库千万不要用,效率低到惊人!
本帖最后由 10xjzheng 于
17:44 编辑
反正我还是多自己搞下寄存器吧,用到平常的功能还好,熟练了还比较容易实现,写完某些功能要优化发现不忍直视,用过的朋友就知道。
真心没有之前的标准库用得爽。
/**
&&* @brief Initialize the UART mode according to the specified
&&*& && && &parameters in the UART_InitTypeDef and initialize the associated handle.
&&* @param huart: UART handle.
&&* @retval HAL status
&&*/
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{
&&/* Check the UART handle allocation */
&&if(huart == NULL)
&&{
& & return HAL_ERROR;
&&}
&&if(huart-&Init.HwFlowCtl != UART_HWCONTROL_NONE)
&&{
& & /* Check the parameters */
& & assert_param(IS_UART_HWFLOW_INSTANCE(huart-&Instance));
&&}
&&else
&&{
& & /* Check the parameters */
& & assert_param(IS_UART_INSTANCE(huart-&Instance));
&&}
&&if(huart-&State == HAL_UART_STATE_RESET)
&&{
& & /* Allocate lock resource and initialize it */
& & huart-&Lock = HAL_UNLOCKED;
& & /* Init the low level hardware : GPIO, CLOCK */
& & HAL_UART_MspInit(huart);
&&}
&&huart-&State = HAL_UART_STATE_BUSY;
&&/* Disable the Peripheral */
&&__HAL_UART_DISABLE(huart);
&&/* Set the UART Communication parameters */
&&if (UART_SetConfig(huart) == HAL_ERROR)
&&{
& & return HAL_ERROR;
&&}
&&if (huart-&AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
&&{
& & UART_AdvFeatureConfig(huart);
&&}
&&/* In asynchronous mode, the following bits must be kept cleared:
&&- LINEN and CLKEN bits in the USART_CR2 register,
&&- SCEN, HDSEL and IREN&&bits in the USART_CR3 register.*/
&&huart-&Instance-&CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
&&huart-&Instance-&CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
&&/* Enable the Peripheral */
&&__HAL_UART_ENABLE(huart);
&&/* TEACK and/or REACK to check before moving huart-&State to Ready */
&&return (UART_CheckIdleState(huart));
}复制代码
建议大家去看LL库,效率比较高!
很无奈的是,我用的STM32L4找不到标志库函数的例程,只有HAL库的。
很无奈的是,我用的STM32L4找不到标志库函数的例程,只有HAL库的。
楼主也在玩L4啊,有LL库,你看看
不敢苟同。我用F10x,今年的新产品已经迁移到HAL库,只有极少BUG需要规避。
不敢苟同。我用F10x,今年的新产品已经迁移到HAL库,只有极少BUG需要规避。
我在一个中断中开启串口接收中断,任何然后丢了几个数据,因为初始化过程很繁琐,本来置寄存器即可,现在还要设置很多标志位。
所以在这种情况下我觉得要帮他改进才行。
楼主也在玩L4啊,有LL库,你看看
你说的是HAL底层操作寄存器的那层还是有另外的?有链接看下吗?
大家再看看串口接收的处理函数!
/**
&&* @brief Handle UART interrupt request.
&&* @param huart: UART handle.
&&* @retval None
&&*/
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
//&&/* UART parity error interrupt occurred -------------------------------------*/
//&&if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESET))
//&&{
//& & __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);
//
//& & huart-&ErrorCode |= HAL_UART_ERROR_PE;
//& & /* Set the UART state ready to be able to start again the process */
//& & huart-&State = HAL_UART_STATE_READY;
//&&}
//
//&&/* UART frame error interrupt occurred --------------------------------------*/
//&&if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
//&&{
//& & __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
//
//& & huart-&ErrorCode |= HAL_UART_ERROR_FE;
//& & /* Set the UART state ready to be able to start again the process */
//& & huart-&State = HAL_UART_STATE_READY;
//&&}
//
//&&/* UART noise error interrupt occurred --------------------------------------*/
//&&if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
//&&{
//& & __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
//
//& & huart-&ErrorCode |= HAL_UART_ERROR_NE;
//& & /* Set the UART state ready to be able to start again the process */
//& & huart-&State = HAL_UART_STATE_READY;
//&&}
//
&&/* UART Over-Run interrupt occurred -----------------------------------------*/
&&if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
&&{
& & __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
//& & huart-&ErrorCode |= HAL_UART_ERROR_ORE;
//& & /* Set the UART state ready to be able to start again the process */
//& & huart-&State = HAL_UART_STATE_READY;
&&}
//
//& &/* Call UART Error Call back function if need be --------------------------*/
//&&if(huart-&ErrorCode != HAL_UART_ERROR_NONE)
//&&{
//& & HAL_UART_ErrorCallback(huart);
//&&}
//
//&&/* UART wakeup from Stop mode interrupt occurred -------------------------------------*/
//&&if((__HAL_UART_GET_IT(huart, UART_IT_WUF) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_WUF) != RESET))
//&&{
//& & __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF);
//& & /* Set the UART state ready to be able to start again the process */
//& & huart-&State = HAL_UART_STATE_READY;
//& & HAL_UARTEx_WakeupCallback(huart);
//&&}
&&/* UART in mode Receiver ---------------------------------------------------*/
&&if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET))
&&{
//& & UART_Receive_IT(huart);
& & aRxBuffer[i] = huart-&Instance-&RDR;
& & i++;
//& & xTimerResetFromISR(USART1_RX_TimeOut_Tmr,0);
& & /* Clear RXNE interrupt flag */
& & __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
&&}
//&&/* UART in mode Transmitter ------------------------------------------------*/
// if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET))
//&&{
//& & UART_Transmit_IT(huart);
//&&}
//
//&&/* UART in mode Transmitter (transmission end) -----------------------------*/
// if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET))
//&&{
//& & UART_EndTransmit_IT(huart);
//&&}
本帖最后由 10xjzheng 于
18:12 编辑
串口接收中断那里,所有的中断都检测一遍,虽然这个很有通用性,但是你只是想接收个串口数据而已啊,要不要这样子。还有,你因为屏蔽掉其他中断就没事啦?No,No。还有接收处理函数,还能不能好好玩耍?这段又是为了通用接收9位和8位数据.....如果这里加上一个宏来裁剪下通用性是不是会好点呢?谁都别跟我说复用性和效率的衡量问题,道理我都懂,可是....
/**
&&* @brief Receive an amount of data in interrupt mode.
&&* @note& &Function is called under interruption only, once
&&*& && && &interruptions have been enabled by HAL_UART_Receive_IT()
&&* @param&&huart: UART handle.
&&* @retval HAL status
&&*/
static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
&&uint16_t*
&&uint16_t uhMask = huart-&M
&&if((huart-&State == HAL_UART_STATE_BUSY_RX) || (huart-&State == HAL_UART_STATE_BUSY_TX_RX))
&&{
& & if ((huart-&Init.WordLength == UART_WORDLENGTH_9B) && (huart-&Init.Parity == UART_PARITY_NONE))
& & {
& && &tmp = (uint16_t*) huart-&pRxBuffP
& && &*tmp = (uint16_t)(huart-&Instance-&RDR & uhMask);
& && &huart-&pRxBuffPtr +=2;
& & }
& & else
& & {
& && &*huart-&pRxBuffPtr++ = (uint8_t)(huart-&Instance-&RDR & (uint8_t)uhMask);
& & }
& & if(--huart-&RxXferCount == 0)
& & {
& && &__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
& && &/* Check if a transmit Process is ongoing or not */
& && &if(huart-&State == HAL_UART_STATE_BUSY_TX_RX)
& && &{
& && &&&huart-&State = HAL_UART_STATE_BUSY_TX;
& && &}
& && &else
& && &{
& && &&&/* Disable the UART Parity Error Interrupt */
& && &&&__HAL_UART_DISABLE_IT(huart, UART_IT_PE);
& && &&&/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
& && &&&__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
& && &&&huart-&State = HAL_UART_STATE_READY;
& && &}
& && &HAL_UART_RxCpltCallback(huart);
& && &return HAL_OK;
& & }
& & return HAL_OK;
&&}
&&else
&&{
& & return HAL_BUSY;
&&}
}复制代码
我觉得还不错,目前卡在了SPI和DMA+中断看得实在是晕。
我调F7的时候看的头都大了,没法下手
F4 的 DMA代码很复杂的,生成的代码比较大。
hal+寄存器 双剑合璧,hal可以快速开发和移植 实时性要求高的自然要再跟进看寄存器做优化,关键代码保持高效率即可
举个栗子:开发完功能实现了,看中断不行太占cpu受不了,跟UART_Receive_IT函数 重写中断处理
另外 一般真不差那几个cpu周期,初始化不差,中断一般也不差,难道1s要进1000000次?那它本身就并不合理
什么叫千万不能用?你用着不好,不代表别人用也不好,每个人的需求都不一样
HAL层已经让你不懂原理的设计程序了,更谈不上提高了基础知识了..........HAL在嵌入式系统使用才好,封装硬件驱动到应用之间.......
hal+寄存器 双剑合璧,hal可以快速开发和移植 实时性要求高的自然要再跟进看寄存器做优化,关键代码保持高 ...
这个说得比较好,目前也是这样子,工作量小。
HAL层已经让你不懂原理的设计程序了,更谈不上提高了基础知识了..........HAL在嵌入式系统使用才好,封装硬 ...
目的是好的,但是不懂原理的设计程序在我看来很难做好高效率驱动。
另外HAL跟嵌入式系统没有半毛钱关系,嵌入式系统只是帮你协调调度好,跟驱动那些没有直接关系。
HAL库还可以呀,配合cube挺好用,频繁中断的中断函数自己重建一下就好
效率其实低下, 用到的地方自己改写,
自己改下 最好
最好跟着主流走 这样系统的bug有人帮你找
这就跟做事只看结果,而不看稳定性..........比如我们老板!
尝试用mdk5的rte吧,不是必须要用st提供的框架的
感觉大势所趋 ,正在熟悉中 !
不敢苟同。我用F10x,今年的新产品已经迁移到HAL库,只有极少BUG需要规避。
能说下哪些bug需要规避么?
我在一个中断中开启串口接收中断,任何然后丢了几个数据,因为初始化过程很繁琐,本来置寄存器即可,现在 ...
开始学PC了,升级一下软件,让你用F4去。
不但空间多用了很多,效率就更不必多说了。
多了去的判断校验,效率肯定不好的。像我们开个10KHZ的中断,哪里受的了这样的速度。
库函数我见过avr32 studio的framework, 绝对大师级写的
这个说得比较好,目前也是这样子,工作量小。
@一天的蓝 说的是一种合理的工程实践模式
如今都会是所谓的trun key模式,而且会越来越流行
随着硬件复杂度和软件复杂度的上升,我们不可能回到原始的51之类、单片机模式
原始简单的操作寄存器,从0开始。。。
而这道理,我想你也懂
不过你起的这标题,属于标题党。
至于效率问题,如今的对于硬件主频而言,问题不是那么敏感
一个80M的主频,考虑理想模型,都是单周期指令,一条指令,只要12.5ns
多执行一些指令,消耗的时间也是可以接受的
如果真是敏感的话,那就特殊局部优化,绕过HAL。
尝试用mdk5的rte吧,不是必须要用st提供的框架的
相比还是ST对自己做的更全面一些。
RTE不是不好,而是统一了ARM核的驱动,ST这样的公司可不乐意啊
感觉HAL库是要做成中间层软件的样子,想法挺好,也是大势所趋。不过,目前还不怎么成熟的样子啊,效率先不说,感觉目前HAL库的易用性和可靠性还没发展到那种能让人直接忽略底层工作原理的程度,还是过过在看了。
正在用RTC&&HAL 库,没法修改亚秒分辨率& &一直默认为255& &
我的批量化的产品都用HAL库,不解楼主
跟着走,哎……习惯3.5,现在搞出个CUBEMX,是比较麻烦
可能是先入为主了
用HAL的USB搞双缓冲,Bug漫天飞,搞了一星期才成,吐了我满地血。 现在换USB lib,一看才发现HAL基本就是从lib抄过来的嘛,一样满地血
用HAL的USB搞双缓冲,Bug漫天飞,搞了一星期才成,吐了我满地血。 现在换USB lib,一看才发现HAL基本就是从 ...
可以尝试下用mdk的usb库,虽然没有源码,基本上都移植好了直接能用,自用感觉不错
相比还是ST对自己做的更全面一些。
RTE不是不好,而是统一了ARM核的驱动,ST这样的公司可不乐意啊 ...
不管st乐意不乐意,mdk就是有这样的雄心壮志。。。
mdk和st是相辅相成的,st要是怠慢下mdk,mdk给st穿小鞋不是分分钟的事情么
效率是有点低,但是开发简单点。另外你可以删除那些判断状态的程序,直接用
正在用RTC&&HAL 库,没法修改亚秒分辨率& &一直默认为255
初始化的时候改异步和同步分频器的值然后在它那个结构体里面找寄存器定义,直接赋值。
感觉HAL库是要做成中间层软件的样子,想法挺好,也是大势所趋。不过,目前还不怎么成熟的样子啊,效率先不 ...
我最近做M0就莫名其妙遇到串口出现FE和ORE的标志,非得每次都判断一下,以前F10X的M3都没这情况。不过我没有用HAL库,用ST的底层LIB自己搞的。
现在没有标准库,只能有HAL库,st趋势已经改变不了了,hal库生成工程还是比较简单的。
LL库是什么来的?百度不到。HAL库让我看到了针对以前的库前所未有的考虑,冗余也好,麻烦也罢,反正就是各种判断,各种超时退出机制
非关键代码用ST库,关键代码自己扒寄存器吧
初始化用库,需要实时性的用寄存器
做产品,用库
搞学习,用寄存器
什么叫千万不能用?你用着不好,不代表别人用也不好,每个人的需求都不一样
目前都是用HAL库,基本都是CubeMx配置,只有在需要再快那么几us的地方才改成寄存器操作。。
不要说得这么严重,效率差不多。以前F4用STD库,F7用HAL库。现在全换HAL库,方便多了。
用过NXP,才知道,ST的寄存器分配有多烂
楼上说HAL库行的,应该没有做过:
1、BOOT+IAP ,对boot占用空间严格要求
2、没有各平台交叉移植,比如ST NXP FSL
3、SI 开发
刚开发完一个STM32L0系列基于HAL库的项目,感觉确实存在效率问题,解决方法就是自己改下代码,比如直接用操作寄存器的方式接收数据(STM32L0x3 ref manual里面最后就有相关代码),但是初始化之类的还是十分好用的。另外,上面有人说老是置位ORE中断,这个是HAL库默认打开的一个中断,可以在初始化的时候加入下面两行代码就行了。
UartzHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT;
UartzHandle.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE; 复制代码
在做crazyflie,用的就是HAL库
设计理念不一样。芯片厂商设计的库需要兼容性强,安全性高,客户上手简单快速。也是现在项目的潮流,不是每个人都需要去了解最底层的寄存器,也不是每个项目都有时间人员去重新开发驱动库。我也是很难接受这种写法,可是这是潮流,不赶上就落伍了,ATMEAL的很早就这么干的。
还没有用到,来学习一下
这是大趋势 类似楼主的还是小众市场&&ST考虑到的是 上手快&&片子易用性
库代码,效率是低一些。主要是方便
个人认为效率不是首要考虑因素
觉得根据具体情况决定用不用吧,
感觉也没差到哪去
关键是要用正确的技术,例如使用 DMA 等等。就算库的效率不是特别高,结果差别也不会特别大。
如果你要库作很多中断处理的那效率影响就会比较多。
关键代码用寄存器就是了。
我还在用HAL库,觉得两面性吧,好处是初始化很方便,效率的话如果要求不高可以考虑使用,毕竟是ST官方的,而且以后的趋势就是HAL库了
对寄存器头大的人(寄存器一会就忘了)用CubeMX自动生成的模板好用,稍微改下就能用。
一般应用可以不考虑效率
对寄存器头大的人(寄存器一会就忘了)用CubeMX自动生成的模板好用,稍微改下就能用。 ...
可以用他的初始化,但是我觉得模板有点乱,还是喜欢自己的模板
寄存器可读性不好,追求效率的地方才用寄存器
阿莫电子论坛, 原"中国电子开发网"

我要回帖

更多关于 急急急 的文章

 

随机推荐