写在开头:这段时间在整理modbus协议时,发现没有一个比较方便使用的串口模块,因此结合之前的一些理解,将串口驱动整理出来。此串口驱动有以下特点:

 

  1. 发送接收均使用DMA
  2. 串口配置不需要从刷固件便能修改,方便二次开发
  3. 数据接收有环形队列缓存,能接收不定长数据帧
  4. 使用读缓存函数能获取当前缓存帧数以及每帧的数据长度.                                                                                                     

说明:

发送:数据在发送过程中,首先被压入缓存,发送计时器会严格控制每条数据的发送时间间隔,发送使用DMA,以减轻CPU的负荷。

接收:数据接收能实现不定长度接收,首先每帧数据都会通过DMA转移到接收缓存中,在每一帧数据到来时,会产生DMA空闲中断,此时会将数据帧的长度存入帧长度缓存。通过帧长度缓存,能够建立接收缓存中每一帧数据的索引,以及能得出缓存中剩余数据帧的个数。因此,在从缓存取出数据时,操作方便,避免程序主循环运行周期导致数据帧取出时周期不固定(这一点后面详细讨论)。

 二 .软件实现

硬件平台为stm32f429,移植到其他平台只需要将初始化改此对应平台即可。

1.初始化

       串口初始化一般分为以下步骤:1.时钟初始化;2.端口初始化; 3.DMA初始化;4.中断初始化。因此建立一个串口类型结构体SERIAL_INIT_TYPE。在使用串口时,定义相应串口号结构体变量,初始化时赋初值完成串口初始化。多数人习惯使用宏定义,对串口的每个引脚,波特率等使用宏定义,然后串口的打开使用宏开关,实现最大程度的消除重复代码。以定义变量的方式来操作同样是为了消除重复代码,但更为重要的一点是,参数灵活性得到提高。既然是变量,值是受控的,因此设备在运行过程中可以通过软件更改端口参数。在很多产品中,都会附带一个上位机软件,以来改变设备的配置(伺服驱动器等),驱动器本身的固件是不变的,属于“一次开发”,而上位机软件属于二次开发,目的是为了适当调整参数,令设备达到最优运行状态。宏定义虽然能减少代码量,但这种预编译处理产生的软件功能限制较死,每次增添功能需要重新刷固件。因此,二次开发也是本文强调的重点。 

以下是结构体成员:
typedef struct 
{struct   {/*有关时钟的配置项*/}rcc_cfg;struct  {/*有关串口的配置项*/}port_cfg;struct  {/*有关DMA的配置*/				}dma_cfg;struct  {/*有关中断的配置*/	}nvic_cfg;
}SERIAL_INIT_TYPE;

下面分别介绍四个内嵌结构体成员,分别是时钟结构体,串口结构体,dma结构体,中断结构体。

 a.时钟结构体

struct   /*rcc */
{uint32_t rxPORT;  /*Port_RCC*/                   uint32_t txPORT;uint32_t USART;   /*USART_RCC*/ uint32_t rxDMA;   /*DMA_RCC*/uint32_t txDMA;	
}rcc_cfg;

串口相关的时钟一般为引脚时钟,串口时钟,dma时钟,这个需要查找硬件手册以确定其值。

b.串口结构体

struct   /*port*/
{uint32_t           baud;                 /*波特率*/USART_TypeDef*     USARTx;               /*串口号*/GPIO_TypeDef*      rxPORT;               /*串口接收引脚端口号*/GPIO_TypeDef*      txPORT;               /*串口发送引脚端口号*/uint16_t           rxPIN;                /*串口接收引脚引脚号*/uint16_t           txPIN;                /*串口发送引脚引脚号*/uint8_t            rxAF;	              /*接收引脚复用*/uint8_t            txAF;                 /*发送引脚复用*/uint8_t            rxSOURCE;             /*接收源*/uint8_t            txSOURCE;             /*发送源*/	
}port_cfg;

c.dma结构体

struct   /*dma*/
{uint32_t                 rxCHANNEL;                        /*接收通道*/uint32_t                 txCHANNEL;                        /*发送通道*/uint32_t                 txFLAG;                           /*发送完成标志*/DMA_Stream_TypeDef*      rxSTREAM ;                        /*接收dma数据流*/DMA_Stream_TypeDef*      txSTREAM ;                        /*发送dma数据流*/USART_TypeDef*           USARTx;                           /*串口号*/uint8_t                  rxbuff[FIFO_SIZE];                /*接收缓存*/uint8_t                  txbuff[FIFO_SIZE];                /*发送缓存*/uint8_t                  fifo_record[FRAME_SIZE];          /*接收帧长度缓存*/uint16_t                 record_point;                     /*帧长度缓存指针*/uint16_t                 length;                           /*缓存长度*/uint16_t                 tail;                             /*缓存尾指针*/uint16_t                 head;			                   /*缓存头指针*/}dma_cfg; 

d.中断结构体

struct   /*nvic*/
{uint8_t   usart_channel;                /*串口中断通道*/uint8_t   usart_Preemption;             /*抢占优先级*/uint8_t   usart_Sub;                    /*从优先级*/uint8_t   dma_txchannel;               /*dma中断通道*/uint8_t   dma_txPreemption;            /*抢占优先级*/			uint8_t   dma_txSub;	                /*从优先级*/
}nvic_cfg;

以下是初始化串口1示例:

SERIAL_INIT_TYPE usart1=
{        .rcc_cfg.USART     			 = RCC_APB2Periph_USART1, /*时钟*/. rcc_cfg.rxPORT    			 = RCC_AHB1Periph_GPIOA,.rcc_cfg.txPORT     			 = RCC_AHB1Periph_GPIOA,.rcc_cfg.rxDMA      			 = RCC_AHB1Periph_DMA2,.rcc_cfg.txDMA      			 = RCC_AHB1Periph_DMA2, .port_cfg.USARTx    			 = USART1,               /*串口*/.port_cfg.baud	     		     = 115200,.port_cfg.rxPORT    			 = GPIOA,.port_cfg.txPORT     		     = GPIOA,.port_cfg.rxPIN     			 = GPIO_Pin_10,.port_cfg.txPIN    			 = GPIO_Pin_9,.port_cfg.rxAF     			 = GPIO_AF_USART1,.port_cfg.txAF      			 = GPIO_AF_USART1,.port_cfg.rxSOURCE  			 = GPIO_PinSource10,.port_cfg.txSOURCE  			 = GPIO_PinSource9,.dma_cfg.USARTx     		     = USART1,               /*dma*/.dma_cfg.rxCHANNEL  		     = DMA_Channel_4,.dma_cfg.txCHANNEL  		     = DMA_Channel_4,.dma_cfg.txSTREAM   		     = DMA2_Stream7,.dma_cfg.rxSTREAM			     = DMA2_Stream5,.dma_cfg.txFLAG     		     = DMA_FLAG_TCIF4,.dma_cfg.head      			 = 0,.dma_cfg.tail      			 = 0,.dma_cfg.length    			 = FIFO_SIZE,.nvic_cfg.usart_channel    	 = USART1_IRQn,         /*中断*/.nvic_cfg.usart_Preemption      = 0,.nvic_cfg.usart_Sub       	     = 1, .nvic_cfg.dma_txchannel   	     = DMA2_Stream7_IRQn,.nvic_cfg.dma_txPreemption	     = 0,.nvic_cfg.dma_txSub       	     = 2   
};

定义以以上串口描述结构体,之后构建初始化函数,初始化时,只需要将以上变量传入初始化函数,即可完成不同串口的初始化。

初始化函数和串口类型结构体相对应,4个块分别初始化。

void usart_config(SERIAL_INIT_TYPE* usart)
{usart_rcc_cfg(usart); usart_nvic_cfg(usart);	 usart_dma_cfg(usart);usart_port_cfg(usart);	
}

具体的初始化过程详细见源码。

2.数据发送

        初始化完成后,dma发送控制已经设置为指定数据地址(txbuff【】)内容到串口,此时只需要要将数据放进发送缓存中,启动dma发送,数据就能发送出去。

        注意:在使用DMA发送时,遇到一个问题,数据只能发送一帧。产生的原因为:dma发送完成后,发送完成标志位被置一,即使在不使能发送中断的情况下,完成标志位也会影响下一帧数据的发送,因此这里使能发送中断,发送完成将标志位清零。

void DMA1_Stream6_IRQHandler(void)   /*dma发送中断*/
{if(DMA_GetFlagStatus(DMA1_Stream6,DMA_FLAG_TCIF6)!=RESET){ DMA_ClearFlag(DMA1_Stream6,DMA_FLAG_TCIF6);}
}static void start_dma(SERIAL_INIT_TYPE* usart,u16 ndtr)  //启动dma
{  /*使能DMA*/DMA_Cmd(usart->dma_cfg.txSTREAM, DISABLE);	   while(DMA_GetFlagStatus(usart->dma_cfg.txSTREAM,usart->dma_cfg.txFLAG) != DISABLE){}	 DMA_SetCurrDataCounter(usart->dma_cfg.txSTREAM,ndtr);        /* USART1  向 DMA发出TX请求 *//*使能DMA*/DMA_Cmd(usart->dma_cfg.txSTREAM, ENABLE);		
}	  

       由于这里对发送时序没有严格要求,因此一启动dma数据立即会发送,但对时序有严格要求的系统,比如某些传感器会有最高频率限制要求,这时就需要加入发送计时器,以一定周期来发送,适应外部低速设备。

3.数据接收

       串口接收数据我们知道会经常用到两种中断:字节中断和帧中断。一个是每接收到一个字节的数据便产生一次中断,另一个是接收到一帧数据后产生中断。使用这两种方式配合,便能实现,串口简单的接收处理,只不过接收是实时的。在接收数据处理不及时的情况下,容易出现丢包情况。

环形缓存:

       在通讯设备中经常听到缓存一词,缓存是避免丢包的有效措施。关于环形缓存的概念,这里不提及,百度有详细的介绍。以下是环形队列的实现方法:

 a .创建队列结构体

#define FIFO_MAX_LEN  200
typedef struct
{uint16_t head;              //队列头uint16_t tail;                //队列尾uint16_t len;                //当前队列数据长度uint8_t buff[FIFO_MAX_LEN];  //队列数组
}u8FIFO_TYPE;

b.队列初始化

void fifo_init(pu8FIFO_TYPE fifo)
{fifo->head=0;fifo->tail=0;fifo->len=0;
}   

c.队列判断空满

bool is_fifo_empty(pu8FIFO_TYPE fifo)
{if(fifo->head==fifo->tail && !fifo->len)   /*头尾相等,长度为0为空*/return 1;elsereturn 0;
}
/*判满*/
bool is_fifo_full(pu8FIFO_TYPE fifo) 
{if(fifo->len>=FIFO_MAX_LEN)          /*长度大于等于最大容量为满*/return 1;elsereturn 0;
}

d.存数据与取数据

/*数据压入缓存*/
bool push_to_fifo(pu8FIFO_TYPE fifo , uint8_t data)
{if( ! is_fifo_full(fifo))
{fifo->buff[fifo->tail]=data;fifo->len++;
/*存入一个字节,尾指针加一当到达最大长度,将尾指针指向0,
以此达到头尾相连的环形缓存区*/
fifo->tail=(fifo->tail+1) % FIFO_MAX_LEN; return 1;}elsereturn 0;
}/*缓存数据弹出*/
bool pop_from_fifo(pu8FIFO_TYPE fifo,uint8_t* data)
{*data = fifo->buff[fifo->head];    /*取出一个字节数据*//*头指针加1,到达最大值清零,构建环形队列*/fifo->head=(fifo->head+1) % FIFO_MAX_LEN; if(!fifo->len){		 fifo->len--;return 1;}elsereturn 0;	 
}

        以上为环形队列的实现,我们可以将压入数据进缓存发在串口中断接收中,每接收到一个数据,便存入缓存,在应用函数中调用缓存数据弹出函数,一个字节一个直接的取出数据。

       在stm32 DMA中,接收DMA能够自动构建环形缓存区,类似上面fifo->tail=(fifo->tail+1) % FIFO_MAX_LEN; 实现方式。通过配置DMA初始化结构体成员:DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  初始化完成后,用户只需要DMA_GetCurrDataCounter函数,便能获取当前缓存剩余容量,也就是队尾tail可以用以下公式获得:tail = MAX_LEN - DMA_GetCurrDataCounter();以上,实现了串口DMA接收数据,

由缓存区取单字节数据。

     可以看出,每次只能从缓存取出一个字节的数据,也就是说每循环一次取一个数据。因此,取数据是和主循环周期相关的。如果我们能知道缓存中数据帧的长度即数量,那么我们就能一次取出一帧的数据。能实现这种,不定长数据接收自然也解决了。下面实现不定长度的接收。

4.不定长度数据接收

 

程序实现:

a.串口空闲中断函数


void USART1_IRQHandler(void)  
{u16 data;	static uint16_t count=0;static uint16_t last_tail=0;if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)  /*空闲中断*/{data = USART1->SR; data = USART1->DR;            /*清除中断标志*//*计算缓存尾指针*/usart1.dma_cfg.tail=MAX_LEN - DMA_GetCurrDataCounter(usart1.dma_cfg.rREAM);/*尾指针由经过环形交接处*/if(usart1.dma_cfg.tail< last_tail)		usart1.dma_cfg.fifo_record[count] =FRAME_SIZE -last_tail  +  usart1.dma_cfg.tail;elseusart1.dma_cfg.fifo_record[count]= usart1.dma_cfg.tail-last_tail;/*将计算的帧长度存入缓存*/last_tail = usart1.dma_cfg.tail;/*构造帧长度环形缓存*/count=(count+1) % FRAME_SIZE;}
}

b.从缓存中取数据

从缓存中取出一个字节:
bool get_byte(SERIAL_INIT_TYPE* usart,uint8_t* data)
{if(usart->dma_cfg.tail==usart->dma_cfg.head)  //空或满return 0;else										  //取数据{*data = usart->dma_cfg.rxbuff[usart->dma_cfg.head];usart->dma_cfg.head = (usart->dma_cfg.head+1)%500;return 1;}
}
从缓存中取出一帧数据:
bool get_str(SERIAL_INIT_TYPE* usart , uint8_t* frame, uint8_t* len)
{uint8_t temp;temp=usart->dma_cfg.fifo_record[usart->dma_cfg.record_point]; if(temp){*len = temp;usart->dma_cfg.fifo_record[usart->dma_cfg.record_point]=0;while(temp--){if(get_byte(usart,frame++)){}else{usart->dma_cfg.record_point= (usart->dma_cfg.record_point+1)%usart->dma_cfg.length;return 0;}} usart->dma_cfg.record_point= (usart->dma_cfg.record_point+1)%FRAME_SIZE;return 1;}elsereturn 0;}

      取出字节函数为内部函数,面向上层的为取出一帧数据bool get_str(SERIAL_INIT_TYPE* usart , uint8_t* frame, uint8_t* len)当取出数据有效时,返回1.输入串口号。frame为取出数据帧后,暂时存储区的首地址。len指向存储数据帧长度的地址。即调用函数,数据帧以及长度会传到frame和len。

三 .接口实现

我们已经实现了串口的读写,初始化函数,为了能被上层更方便的调用。应该将接口统一化。定义以下机构体:

typedef struct

{

        void(*init)(SERIAL_INIT_TYPE* usart);

        void(*write)(SERIAL_INIT_TYPE* usart,uint8_t* data, uint16_t len);

        bool(*read)(SERIAL_INIT_TYPE* usart,uint8_t* data,uint8_t* len);

}SERIAL_OPS_TYPE;

 

其中函数指针分别指向串口1的发送接收函数,初始化函数。当上层需要使用串口时。

按以下步骤实现(拿modbus_slave来举例):

/*第一步定义modbus的发送接收端口类型,若存在其他接口类型比如can,同

样建立类似的驱动,定义一个输入can的类,然后在modbus中初始化时具体

选择哪种接口*/

SERIAL_OPS_TYPE  md=

{

        .init=usart_config,

        .write=usart_send,

        .read=get_str

};

/*以下分别时modbus的初始化,发送,接收函数,淡化了串口号*/

void modbus_init(void)

{

   md.init(&usart2);

}

/*发送指定长度数据*/

void modbus_write(uint8_t* frame,uint16_t len)

{

   md.write(&usart2,frame,len);

}

/*读取一个字节*/

bool modbus_read(uint8_t* data,uint8_t* len)

{

   return md.read(&usart2,data,len);

}

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. DedeCMS V5.7sp2最新版本parse_str函数SQL注入漏洞

    织梦dedecms,在整个互联网中许多企业网站,个人网站,优化网站都在使用dede作为整个网站的开发架构,dedecms采用php+mysql数据库的架构来承载整个网站的运行与用户的访问,首页以及栏目页生成html静态化,大大的加快的网站访问速度,以及搜索引擎的友好度,利于百度蜘蛛的抓取…...

    2024/4/17 12:56:32
  2. 《Qt5:同一个界面多窗口或者多页面切换(QStackedWidget)》

    QStackedWidget可用于创建类似于QTabWidget提供的用户界面。之前要显示不同的内容,都是通过创建子窗口的方式来实现的,这种是属于弹窗式,而QStackedWidget可以实现同一界面切换不同的窗口,相当于把弹窗式的子窗口都绑定到了一个统一的区域,直接切换就可以显示不同子窗口的…...

    2024/4/17 19:24:35
  3. Beanshell vs JSR223 vs Java JMeter脚本:性能关闭你一直在等待!

    有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能。查看最流行的扩展机制,比较性能并分析哪一个是最好的。 这是乐队之战,JMeter风格。Beanshell V. JSR223 V. Java Request Sampler在我们之前的帖子中, JMeter Performance和Tuning Tips ( 由fantastik Phili…...

    2024/4/17 19:25:04
  4. [STM32] NOTE02-正点原子STM32F429IGT6开发板资源分析

    核心板:图中出现的chips & 重要接口:串口通信接口(TXD, RXD, GND)1.SPI FLASH 32MBSPI Serial Peripheral Interface 串行接口1、SPI Flash (即SPI Nor Flash)是Nor Flash的一种; 2、NOR Flash根据数据传输的位数可以分为并行(Parallel)NOR Flash和串行(SPI)NOR …...

    2024/4/17 19:24:35
  5. SQL注入漏洞全接触--高级篇

    看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。 第一节、利用系统表注入SQLServer数据库 SQLServer是一个功能强大的数据库系统,…...

    2024/4/19 9:30:56
  6. C3P0数据源详细配置

    <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 …...

    2024/4/17 19:26:23
  7. 2020网鼎杯玄武组部分题writeup(签到/vulcrack/java/js_on)

    签到题 思路 浏览器F12,调取ajax,输入队伍token,获取flag 过程 (1)浏览器进入F12查看js,看到game_manage.js这个js,看名字像是控制游戏的(2)进入js,通过搜索“move”和“ajax”等关键字,以及if (f.value == 1024)条件,看到如下代码,是给后端发请求并弹窗(3)复制…...

    2024/4/17 19:25:41
  8. RT-Thread 移植是stm32F429 pwm例程

    估计来到这里的小伙伴都应该和我差不多,刚开始把rtt移植到stm32上,在用env配置的时候多少会遇到一些问题,我也是不会自己瞎搞搞出来了(哈哈哈,没办法,太菜了),所以希望你们更轻松点。 好了我们进入正题。 在开始之前需要 : 1、env配置好 env配置教程 2、示例代码下载…...

    2024/4/19 13:10:20
  9. 组队竞赛:牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。

    例如: 一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2 为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。 如样例所示: 如果牛牛…...

    2024/4/17 19:24:29
  10. 如何检查WEB站点SQL注入漏洞

    Submit:x0r revise:x0r date:20080227 source document:internet 为了确保将自己的Web站点和Web应用程序达到最高效安全,免受SQL注入式攻击后所带来的麻烦。本文讲述了三部分关于防范SQL注入式攻击的安全检查 1.通过彻底审核针对Web站点和Web应用程序的SQL注入式攻击和其它…...

    2024/4/17 19:25:35
  11. Unity WebGL环境搭建、开发、使用

    前言Unity WebGL是unity公司替换Unity Web Player的新产品,优点是不需要安装插件,用支持HTML5的浏览器打开网页即可使用。本文描述Unity WebGL的相关开发工具及JS开发技术要点。 缺点是目前还不支持移动设备!安装设置下载安装Unity Editor注册一个UnityID,登录后就可以开始…...

    2024/4/13 19:39:18
  12. win10系统word2016打开出现运行时错误 “429 ActiveX部件不能创建对象” 的解决方法!

    手工注册此文件: 点击“开始”→“运行”在弹出的输入框中键入以下命令: regsvr32 "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll" regsvr32 "C:\Program Files\Common Files\Microsoft Shared\DAO\dao350.dll" 然后按回车键,注意必…...

    2024/4/17 19:25:11
  13. jmeter断言-BeanShell断言

    1.什么是BeanShell断言?BeanShell断言可以使用beanshell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用beanshell脚本。在这里除了可以使用beanshell的内置变量外,主要通过Failure和FailureMessage来设置断言结果。Failure = …...

    2024/4/19 12:29:27
  14. BlueCMS v1.6 sp1 /admin/login.php SQL注入漏洞分析

    BlueCMS v1.6 sp1 /admin/login.php SQL注入漏洞分析BlueCMS v1.6 sp1 /admin/login.php SQL注入漏洞分析 略读代码: 转换思路: 尝试宽字节注入: 理解宽字节: 编写pocsuite插件: requests不进行urldecode: 验证:总结: 参考:略读代码:开头包含了文件require_once(dirn…...

    2024/4/18 6:47:07
  15. 听说API大赛有神奇作品出现?

    原文链接听说API大赛有神奇作品出现?发布时间:2017-05-08 10:16:21415人关注3人参与API大赛截止到今天已有3个月了,抱着好奇心,去看了一下活动网站,发现了大波的作品晒在上面,但是作品名字都是稀奇古怪的。认真看了一下简短的介绍,也没有看太明白,就找了两个参赛团队了…...

    2024/4/17 19:25:29
  16. 《WebGL编程指南》---从示例代码中学习WebGL之初识【2】

    在上一节中,我们知道了如何简单的WebGL程序及其相关函数的使用。在这一节中,我们学习如何用简单的着色器画一个点。我们先来简单说说这里用到的两个着色器。顶点着色器(Vertex shader)顶点着色器实际上就是一段小程序,它描述了应用程序传进来的顶点的一些特性,比如位置、颜…...

    2024/4/19 20:49:41
  17. c3p0xml配置详解

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property>…...

    2024/4/18 17:25:32
  18. BeanShell 学习指南

    下面是 BeanShell 的入门教程,请点击查看详情!欢迎大家提出宝贵意见!快速开始什么是BeanShell?BeanShell入门指南BeanShell快速开始BeanShell的GUI(图形用户界面)BeanShell中的Java指令和表达式BeanShell实用命令BeanShell脚本方法BeanShell中实现接口BeanShell的脚本对象从…...

    2024/3/31 18:14:23
  19. STM32F429--固件库点亮LED灯

    文件说明bsp_led.c负责LED的初始化配置 bsp_led.h负责外设LED函数的声明,以及宏定义,提高移植性 main.c实现功能点亮LED代码 1.mai.c #include "stm32f4xx.h" #include "bsp_led.h"int main(void) {while(1){LED_GPIO_Config();} }2.bsp_led.c #include …...

    2024/4/19 12:10:15
  20. webGL入门-四阶贝塞尔曲线绘制

    随着现代浏览器端技术不短进步,web也逐渐支持了3D绘图技术。时至今日webGL这项技术已经在去年迎来了2.0版本。现如今数据可视化技术也日益繁杂起来,越来越多的数据可视化也逐渐从平面图表增加了许多新的3D类型图表,亦或者借助webGL的力量让数据渲染能力得到大幅度提升。本人…...

    2024/4/17 19:25:17

最新文章

  1. Ubuntu终端自动补全

    文章目录 前言配置安装zsh安装 oh-my-zsh安装自动补全插件zsh-autosuggestions 参考 前言 Oh My Zsh 是一个针对命令行 shell 的开源框架&#xff0c;主要用于增强和美化命令行环境。它建立在 Zsh&#xff08;一种强大的 shell 替代品&#xff09;之上&#xff0c;提供了丰富的…...

    2024/4/25 4:24:24
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 使用Nginx搭载文件服务器

    1.进入nginx.conf的配置 带有alias别名的配置 location /root {alias /home/icore;autoindex on; } 带有别名&#xff1a;alias的路径 当访问ip:port/root 默认会直接进入到/home/icore , 浏览器显示的是/home/icore目录下的内容&#xff0c; 不带alias别名使用root的配置 …...

    2024/4/19 3:32:38
  4. 手机无线投屏到windows11电脑

    1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...

    2024/4/23 6:25:34
  5. Spring集成MyBatis

    基本准备 创建Dynamic Web Project 引入相关jar包 Spring框架相关jar包 MyBatis连接Spring相关jar包 连接MySQL驱动包 JSTL标签库包 添加db.properties文件&#xff0c;该属性文件配置连接数据库相关信息 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/myba…...

    2024/4/23 6:22:22
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/23 20:58:27
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/23 13:30:22
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/23 13:28:06
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/24 18:16:28
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/23 13:27:44
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/23 13:29:53
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/23 13:27:22
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/23 13:28:42
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/23 22:01:21
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/23 13:29:23
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/24 16:38:05
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/23 13:28:14
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/23 13:27:51
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/23 13:27:19
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57