STM32串口使用详解

发布者:心灵之舞最新更新时间:2018-09-11 来源: eefocus关键字:STM32  串口使用 手机看文章 扫描二维码
随时随地手机看文章

一、关于串口需要了解的几个知识点:

1.波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称为波特率。

   波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。

   串口的传输与网络等其他的传输有着相似之处,比如常用的wifi,区别在与这些网络的单位是k,只有串口是按位来计数的。

2.单工,半双工,全双工:

   单工:只能一个方向传输

   半双工:可以两个方向传输,但需要分时复用

   全双工:两个方向传输


二、初始化函数

串口的初始化包括以下几部分:

1.时钟初始化:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口1

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//端口复用

初始化的时候一共有三个时钟需要打开,一是IO口,二是串口,三是端口复用。

STM32的串口1用的是PA9、PA10两个端口,串口2用的是PA2、PA3两个端口,因此初始化的时候打开的是GPIOA的时钟。加粗部分是重点,我在用端口的时候就没有加这句话,导致一直不好使。要区分开端口复用和端口重映射,它们完全是两个不同的概念。在51单片机里面,没有端口复用这种用法,某个端口在用作串口的时候也会被当做普通IO来区分,这就像你洗衣服的时候各种衣服都混在一起洗,不加以区分。但是到了STM32的时候,这里有一个复用功能,当你洗浅色衣服的时候,深色的衣服不会进入到这个盆里,这就避免了许多问题,这也是STM32比51高级的地方。


2.IO初始化:

PA9是发送口,在设置的时候注意要相应的设为复用推挽输出。

PA10是接收口,在设置的时候要设为浮空输入,由于是输入,所以没有必要再设置口线翻转速度。

  

 //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;            //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.9

3.串口初始化:

USART_InitTypeDef  USART_InitStructure;

USART_InitStructure.USART_BaudRate=9600;//波特率:9600

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//数据长度:8位

USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位:1位

USART_InitStructure.USART_Parity=USART_Parity_No;//校验位:无

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//数据流:无

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//使能接收、发送模式

USART_Init(USART1,&USART_InitStructure);

以上是串口的结构体变量的初始化设置。一般情况下的串口初始化都是上面这种情况,数据流这个我们一般是用不到的,它是一个关于调制解调的东西,这里不做深入探究。


USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接收中断标志使能

USART_Cmd(USART1,ENABLE);//打开串口使能

USART_ClearFlag(USART1,USART_FLAG_TC);  //清除发送完成标志位

接收中断标志使能是在使用串口接收中断的时候才需要的。在这里清除发送完成标志位是为了避免接收不到第一个数据的情况。


4.中断初始化:

串口的使用方式有两种:查询、中断

一般情况下,发送数据常用查询方式,接收数据常用中断的方式。这和51的串口类似,查询就是判断发送或接收标志位是否被置位,中断是当接收到别的地方发来的数据的时候中断标志位就会溢出从而触发中断,打断主程序去执行中断服务程序。


中断:

与其他的中断设置方式类似,要设置中断分组,响应优先级,抢占优先级。

void NVIC_Configuration(void)

{

    NVIC_InitTypeDef NVIC_InitStructure; //定义结构体

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断分组

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1的中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级为1

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断

    NVIC_Init(&NVIC_InitStructure);

}

注意如果用到中断的话还要使能接收中断,这个使能在串口初始化中完成,见上面。


三、串口的使用

1.查询方式:

在主程序里面使用时有两句话:

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成标志位被置位

USART_SendData(USART1,xxx);//向上位机发送数据

发送完成标志位被置位说明上一个数据已经发送完成了,于是进行下一个数据的发送


2.中断方式:

中断服务函数的编写套路如下:

void USART1_IRQHandler(void)

{

   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断接收中断标志位是否置位,即是否有数据发送过来

   {

        xxx=USART_ReceiveData(USART1);//将接收到的数据赋给xxx

        xxxxxxx。。。。       

   }

}

四:完整代码


#if EN_USART1_RX   //如果使能了接收

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误     

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15,  接收完成标志

//bit14,  接收到0x0d

//bit13~0,  接收到的有效字节数目

u16 USART_RX_STA=0;       //接收状态标记    

  

void uart_init(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

   

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

  

  //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;            //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.9

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);               //初始化GPIOA.10  

 

 

  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   //子优先级3

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //IRQ通道使能

  NVIC_Init(&NVIC_InitStructure);                 //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

  USART_InitStructure.USART_BaudRate = bound;//串口波特率

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

  USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

  USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

 

 

  USART_Init(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE);                    //使能串口1 

 

 

}

 

 

void USART1_IRQHandler(void)                  //串口1中断服务程序

  {

  u8 Res;

#if SYSTEM_SUPPORT_OS     //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

  OSIntEnter();    

#endif

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

    {

    Res =USART_ReceiveData(USART1); //读取接收到的数据

    

    if((USART_RX_STA&0x8000)==0)//接收未完成

                    {

        if(USART_RX_STA&0x4000)//接收到了0x0d

                            {

                              if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

                              else USART_RX_STA|=0x8000;  //接收完成了 

                            }

        else //还没收到0X0D

                            { 

                              if(Res==0x0d)USART_RX_STA|=0x4000;

                              else

                                {

                                  USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

                                  USART_RX_STA++;

                                  if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收    

                                }    

                            }

    }        

     } 

#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

  OSIntExit();                         

#endif

#endif  

/********************************************2018年6月15号*****************************************/


使用查询方式的USART:

设置时钟:

      RCC_APB2Periph_AFIO  功能复用IO时钟

      RCC_APB2Periph_GPIOA  GPIOA时钟

      RCC_APB2Periph_USART1 USART1时钟

 

你可以用 //使能串口1,PA,AFIO总线  RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);

 

或直接

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE); //全部APB2外设时钟开启

 

注意USART2的你开启为RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

 

设置GPIO:

 

   GPIO_InitTypeDefGPIO_InitStructure;

    

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;  //推挽输出-TX

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入-RX

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

设置USART:

 

   这里我用的是3.0的库相对于2.0的库来说多了一步,先说2.0

   USART_InitTypeDef USART_InitStructure;

   USART_StructInit(&USART_InitStructure);//装填默认值

   USART_Init(USART1, &USART_InitStructure);//根据USART_InitStruct中指定的参数初始化外设USARTx寄存器

   USART_Cmd(USART1, ENABLE); //启用就好了~!

 

   而3.0的库需要

   USART_InitTypeDefUSART_InitStructure;

   USART_ClockInitTypeDefUSART_ClockInitStructure;

   USART_StructInit(&USART_InitStructure);

   USART_ClockStructInit(&USART_ClockInitStructure);

   USART_ClockInit(USART1,&USART_ClockInitStructure);

   USART_Init(USART1,&USART_InitStructure);

   USART_Cmd(USART1,ENABLE);

//只是多分出了1个USART_ClockInitStructure 我也不知为啥要这样??为了同步异步模式?USART_InitStruct中指定的参数内容为:(2.0的)

typedef struct

{

u32 USART_BaudRate; //USART传输的波特率

u16 USART_WordLength;//一个帧中传输或者接收到的数据位数通常是8

u16 USART_StopBits; //停止位

u16 USART_Parity; //奇偶校验

u16 USART_HardwareFlowControl; //硬件流控制模式使能还是失能

u16 USART_Mode; //指定了使能或者失能发送和接收模式

u16 USART_Clock;//提示了USART时钟使能还是失能

u16 USART_CPOL;//指定了下SLCK引脚上时钟输出的极性

u16 USART_CPHA;//指定了下SLCK引脚上时钟输出的相位

u16 USART_LastBit;

//来控制是否在同步模式下,在SCLK引脚上输出最后发送的那个数据字通常用USART_LastBit_Disable

} USART_InitTypeDef;

 

 

我靠~!太细了~!我只知道(9600,8,n,1)这就够了 其他的统统默认~!

 

  USART_StructInit(&USART_InitStructure);

  USART_ClockStructInit(&USART_ClockInitStructure); //2.0不用这句,这样就设好了好了~!自动为您装填了默认参数。默认的参数如下(3.0的库):

 

voidUSART_StructInit(USART_InitTypeDef* USART_InitStruct)

{

  USART_InitStruct->USART_BaudRate= 9600;

  USART_InitStruct->USART_WordLength =USART_WordLength_8b;

  USART_InitStruct->USART_StopBits= USART_StopBits_1;

  USART_InitStruct->USART_Parity =USART_Parity_No ;

  USART_InitStruct->USART_Mode =USART_Mode_Rx | USART_Mode_Tx;

  USART_InitStruct->USART_HardwareFlowControl =USART_HardwareFlowControl_None; 

}

 

void USART_ClockStructInit(USART_ClockInitTypeDef*USART_ClockInitStruct)

{

 

  USART_ClockInitStruct->USART_Clock =USART_Clock_Disable;

  USART_ClockInitStruct->USART_CPOL= USART_CPOL_Low;

  USART_ClockInitStruct->USART_CPHA= USART_CPHA_1Edge;

  USART_ClockInitStruct->USART_LastBit =USART_LastBit_Disable;

}

 

/************************************************************************************************/

 

当然了你也可以自己设参数,比如这样。

void USART_Configuration(void)

{

 USART_InitTypeDef USART_InitStructure;

 USART_ClockInitTypeDefUSART_ClockInitStructure;

 

 USART_InitStructure.USART_BaudRate =9600;

 USART_InitStructure.USART_WordLength =USART_WordLength_8b;

 USART_InitStructure.USART_StopBits =USART_StopBits_1;

 USART_InitStructure.USART_Parity =USART_Parity_No;

 USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;

 USART_InitStructure.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;

 

 USART_ClockInitStructure.USART_Clock =USART_Clock_Disable;

 USART_ClockInitStructure.USART_CPOL =USART_CPOL_Low;

 USART_ClockInitStructure.USART_CPHA =USART_CPHA_2Edge;

 USART_ClockInitStructure.USART_LastBit =USART_LastBit_Disable;

 

 USART_ClockInit(USART1,&USART_ClockInitStructure);

 USART_Init(USART1,&USART_InitStructure);

 

 USART_Init(USART1, &USART_InitStructure);

 

 USART_ClockInit(USART1,&USART_ClockInitStructure);

 USART_Cmd(USART1, ENABLE);

 

} ////USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;除了这句以外其他的都和默认的参数一样,二者有啥区别我至今也不太清楚但就一般的应用来说两个都可以正常工作。

 

 

收发的方法:

 1.发送

void USART1_Puts(char *str)

{

   while(*str)

    {

       USART_SendData(USART1, *str++);

       

       while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

    }

}

USART1_Puts("hello-java~!\r\n"); //这样就发送了hello-java~!跟C语言的printf不太一样在于\n并没有另起一行要用个\r这样在终端上好看。

 

 2.接收

u8 uart1_get_data; //存放接受的内容

while(1)

{

  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)

    {           

      uart1_get_data = USART_ReceiveData(USART1);

      USART1_Puts("\r\n获取到串口1数据:");

       USART1_Putc(uart1_get_data);

      USART1_Puts("\r\n");  

    }

 

}

 

查询法的可以看出要不断扫描不是很好,下面介绍中断法。

 

首先配置时钟:这里我拿USART2说事:

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//USART2和USART3都在在APB1上而USART1是在APB2上的

 

设置GPIO:

 

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |ENABLE);

 

    //A2 做T2X

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //A3 做R2X

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

 

 配置SUART2:

 

 USART_InitTypeDef USART_InitStructure;

 USART_ClockInitTypeDefUSART_ClockInitStructure;

 

 USART_StructInit(&USART_InitStructure);

 USART_ClockStructInit(&USART_ClockInitStructure);

 USART_ClockInit(USART2,&USART_ClockInitStructure);

 USART_Init(USART2,&USART_InitStructure);

 USART_Cmd(USART2, ENABLE);

 

 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启SUART2的接收中断同理还有【看图】然后中断服务程序:这个自己在stm32f10x_it.c添加就可以了。

 

void USART2_IRQHandler(void)

{

 //接收中断

 if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)

 {

  USART_ClearITPendingBit(USART2,USART_IT_RXNE);

  Uart2_Get_Data=USART_ReceiveData(USART2);

  Uart2_Get_Flag=1;

 }

 

 //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]

 if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)

 {

  USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR其实就是清除标志

  USART_ReceiveData(USART2);    //读DR

 }

}

 

然后在main里检测Uart2_Get_Flag

 

if(Uart2_Get_Flag)

  {

   Uart2_Get_Flag=0;

   USART2_Puts("\r\n2获取到串口2数据:");

   USART2_Putc(Uart2_Get_Data);

   USART2_Puts("\r\n");

  }


关键字:STM32  串口使用 引用地址:STM32串口使用详解

上一篇:STM32F10X_XX宏定义的选择及含义
下一篇:STM32串口中断的4种接收数据的实现方式

推荐阅读最新更新时间:2024-03-16 16:13

STM32开发笔记68: keil中使用ST-Link不能成功下载的真实原因
单片机型号:STM32F091RCT6 在STM32开发笔记67: 在keil中使用ST-Link不能成功下载的解决方法提到解决keil中使用ST-Link不能成功下载的一种方法,经仔细分析其实原因还在于程序上。 不能成功下载的程序中,包含如下程序,: CInit::CInit(uint8_t mode) { //底层初始化 HAL_Init(); //GPIO时钟使能 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENAB
[单片机]
基于STM32的三轴数字罗盘HMC5883L模块的测试方案
  最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测量、输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲(可以配置一个外部中断捕获DRDY引脚的下降沿,并在中断服务程序中读取数据),在STM32中可以设置一个下降沿触发的外部中断,并在中断服务程序中调用角度数据读取函数。以下为操作该模块的主要步骤。   一、IIC协议相关操作(单片机作为主机控制时钟线)   宏定义:   //这里用到了STM32的位带区操作,方便实现对一个位的操作   //PB13配置为OD输出,同时外部给上拉电阻,这样既可输出信号给从机,也能   //在PB1
[单片机]
基于<font color='red'>STM32</font>的三轴数字罗盘HMC5883L模块的测试方案
一种基于STM32和PPG技术的腕戴式心率计设计
引言 心血管疾病是威胁人类生命健康的严重疾病,且发病年龄呈现年轻化的趋势。随着人们健康意识的增强,自我保健的需求不断增长,医院中精度高但使用不便的心电图仪已不能满足人们对心脏进行日常监护的需求。因此基于光电容积脉搏波(Photo-Plethysmography,简称PPG)技术的可穿戴式心率测量设备被广泛应用于心率监测领域。虽然市面上已有多种便携式心率仪,但大部分不能在人们进行日常活动时应用,只能进行短时间段的监测,不能有效抵抗运动干扰。夹于耳垂或头戴式的测量设备也不利于用户体验。 基于以上考虑,本文以STM32L152CB为控制核心,设计出了一款可以戴在手腕上的低功耗穿戴式心率计,设备体积小、携带方便、抗干扰能力强、测量精度
[单片机]
一种基于<font color='red'>STM32</font>和PPG技术的腕戴式心率计设计
STM32到TM4C123
我主要是最近看ACfly的代码时,发现他有的工程的文件的.s文件讲道理是启动文件不是STM32,而是TM4C123,我怀疑是TI的芯片,查了下果然是的,应该是电赛准备的。但是这里可以看到换成其他芯片也是有专门的启动文件的。 从51单片机到STM32再到TM4C123 目录 系统时钟 GPIO相关 通用定时器相关 PWM相关 UART通信相关 写在前面: 进入TI的学习,说明STM32 已经掌握的差不多了,没有掌握的很好也没关系,正好两块单片机对比着学习更能加深映像。这篇只是简单的介绍TI,篇幅比较短比,主要还是叙述了32和TI的不同的地方,相似的就没有再写出来,不能完全的拿来当作学习资料。 一点学习TI
[单片机]
从<font color='red'>STM32</font>到TM4C123
STM32程序之MAX6675热电偶温度读取
第一次编写STM32程序,有很多问题请教,我想把MAX6675的SO的数据读出来转换成实际温度,用串口工具读出来。 电路是标准的SPI接法,SO没有上拉电阻。 MISO脚配置为浮空,没有做内部上拉。 用HAL很简单,CS拉低以后,一个SPI读两个字节进来,然后就是凑成12位,换算。 MAX6675文档强调是在时钟下降沿读取数据,因此将SPI2配置为: view plain copyhspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; hspi2.Init.BaudRatePrescaler = SPI_BA
[单片机]
32. FATFS实验讲解
一。简单回顾 二。FATFS移植步骤 最主要的是配置ffconf.h 和 编写 diskio.c,修改diskio.c里的6个函数。 三。FATFS开发函数 移植完成后就可以调用文件系统提供的API。 所有的操作完成后都要调用f_close 关闭文件。 FATFS把API分成4类: 第一类:文件的操作 如打开文件,读写文件,关闭文件等。 第二类:目录操作 比如打开目录,关闭目录,读目录 第三类:目录的管理 第四类:驱动器磁盘的管理 在doc目录下00index_e.html文件中,有所有API的描述和实例。 四。FATFS例程讲解 1. stdio.c文件按照具体的开发平
[单片机]
32. FATFS实验讲解
STM32 SysTick基于3.5库函数
#include stm32f10x.h #include led.h #include stdio.h /*********************************************************************** ***********************************************************************/ static __IO uint32_t TimingDelay; /*********************************************************************** **********
[单片机]
意法半导体二代STM32微处理器推动智能边缘发展,提高处理性能和工业韧性
新STM32MP2 MPUs搭载64位处理器和边缘 AI加速器 与生俱来的速度、安全性和可靠性 依托STM32生态系统,加快应用开发,安全配置网络 2024年3月12日,中国 -- 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST)发布了新一代的STM32MP2系列工业级微处理器 (MPUs),以推动智能工厂、智能医疗、智能楼宇和智能基础设施等领域未来的发展。 数字化转型席卷全球,它推动企业提高生产效率、改善医疗服务质量,加强楼宇、公用设施和交通网络的安全和能源管理。数字化的核心赋能技术包括云计算、数据分析、人工智能 (AI)和物联网 (IoT)
[单片机]
意法半导体二代<font color='red'>STM32</font>微处理器推动智能边缘发展,提高处理性能和工业韧性
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved