历史上的今天
返回首页

历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2019年08月30日 | STM32开发 -- 串口详解

2019-08-30 来源:eefocus

讲完GPIO,接下来看一下串口。

串口通信,已经讲了很多次了。这次主要想看的是STM32单片机怎么配置串口。

S5PV210开发 – 通信

S5PV210开发 – UART 详解

S5PV210开发 – 串口驱动开发

UNIX再学习 – RS485 串口编程

汽车行驶姿态 – 串口通信

日常生活小技巧 – UART 回环测试


一、通信接口

处理器与外部设备通信的两种方式:


并行通信:

-传输原理:数据各个位同时传输。

-优点:速度快

-缺点:占用引脚资源多


这里写图片描述

串行通信:

-传输原理:数据按位顺序传输。

-优点:占用引脚资源少

-缺点:速度相对较慢

这里写图片描述

串行通信,按照数据传送方向,分为:

单工:

数据传输只支持数据在一个方向上传输

这里写图片描述

半双工:

允许数据在两个方向上传输,但是,在某一时刻,只允许数

据在一个方向上传输,它实际上是一种切换方向的单工通信;

这里写图片描述

全双工:

允许数据同时在两个方向上传输,因此,全双工通信是两个

单工通信方式的结合,它要求发送设备和接收设备都有独立

的接收和发送能力。


这里写图片描述

串行通信的通信方式:

**同步通信:**带时钟同步信号传输。

如:SPI,IIC通信接口

**异步通信:**不带时钟同步信号。

如:UART(通用异步收发器),单总线


常见的串行通信接口:

这里写图片描述


二、STM32的串口通信接口

UART:通用异步收发器(universal asynchronous receiver and transmitter)

USART:通用同步异步收发器(universal synchronous asynchronous receiver and transmitter)


其中:

通用同步异步收发器(USART)

小容量产品:是指闪存存储器容量在16K至32K字节之间的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。

中容量产品:是指闪存存储器容量在64K至128K字节之间的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。

大容量产品:是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。

互联型产品:是指STM32F105xx和STM32F107xx微控制器。

除非特别说明,本章描述的模块适用于整个STM32F10xxx微控制器系列。


我使用的是 STM32F105xx,所以是互联型产品,包含3个USART和2个UART。(USART1/USART2/USART3/UART4/UART5)


三、UART异步通信方式引脚连接方法

-RXD:数据输入引脚。数据接收。

-TXD:数据发送引脚。数据发送。

串口交叉线

这里写图片描述

串口直通线

这里写图片描述


四、UART异步通信方式特点

● 全双工的,异步通信

● NRZ标准格式

● 分数波特率发生器系统

─ 发送和接收共用的可编程波特率,最高达4.5Mbits/s

● 可编程数据字长度(8位或9位)

● 可配置的停止位-支持1或2个停止位

● LIN主发送同步断开符的能力以及LIN从检测断开符的能力

─ 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符

● 发送方为同步传输提供时钟

● IRDA SIR 编码器解码器

─ 在正常模式下支持3/16位的持续时间

● 智能卡模拟功能

─ 智能卡接口支持ISO7816-3标准里定义的异步智能卡协议

─ 智能卡用到的0.5和1.5个停止位

● 单线半双工通信

● 可配置的使用DMA的多缓冲器通信

─ 在SRAM里利用集中式DMA缓冲接收/发送字节

● 单独的发送器和接收器使能位

● 检测标志

─ 接收缓冲器满

─ 发送缓冲器空

─ 传输结束标志

● 校验控制

─ 发送校验位

─ 对接收数据进行校验

● 四个错误检测标志

─ 溢出错误

─ 噪音错误

─ 帧错误

─ 校验错误

● 10个带标志的中断源

─ CTS改变

─ LIN断开符检测

─ 发送数据寄存器空

─ 发送完成

─ 接收数据寄存器满

─ 检测到总线为空闲

─ 溢出错误

─ 帧错误

─ 噪音错误

─ 校验错误

● 多处理器通信 – 如果地址不匹配,则进入静默模式

● 从静默模式中唤醒(通过空闲总线检测或地址标志检测)

● 两种唤醒接收器的方式:地址位(MSB,第9位),总线空闲


五、串口通信过程


这里写图片描述

六、STM32串口异步通信需要定义的参数

起始位

数据位(8位或者9位)

奇偶校验位(第9位)

停止位(1,15,2位)

波特率设置

这里写图片描述


七、串口配置

串口设置的一般步骤可以总结为如下几个步骤:

1、串口时钟使能,GPIO时钟使能

2、串口复位

3、GPIO端口模式设置

4、串口参数初始化

5、开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

6、使能串口

7、编写中断处理函数


下面, 我们就简单介绍下这几个与串口基本配置直接相关的几个固件库函数。 这些函数和定义主要分布在 stm32f10x_usart.h 和stm32f10x_usart.c 文件中。

1.串口时钟使能。 串口是挂载在 APB2 下面的外设,所以使能函数为:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);


2.串口复位。 当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。 复位的是在函数 USART_DeInit()中完成:


void USART_DeInit(USART_TypeDef* USARTx);//串口复位


比如我们要复位串口 1,方法为:


USART_DeInit(USART1); //复位串口 1


3.串口参数初始化。 串口初始化是通过 USART_Init()函数实现的,


void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);


这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。

第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针, 这个结构体指针的成员变量用来设置串口的一些参数。 一般的实现格式为:


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; //收发模式


从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发)。 我们可以根据需要设置这些参数。

4.数据发送与接收。 STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。

STM32 库函数操作 USART_DR 寄存器发送数据的函数是:


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);


通过该函数向串口寄存器 USART_DR 写入一个数据。

STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


通过该函数可以读取串口接受到的数据。

5.串口状态。 串口的状态可以通过状态寄存器 USART_SR 读取。 USART_SR 的各位描述如图 9.1.1 所示:

这里写图片描述

这里我们关注一下两个位,第 5、 6 位 RXNE 和 TC。

RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。

TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式: 1)读 USART_SR,写USART_DR。 2)直接向该位写 0。

状态寄存器的其他位我们这里就不做过多讲解,大家需要可以查看中文参考手册。

在我们固件库函数里面,读取串口状态的函数是:


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


这个函数的第二个入口参数非常关键, 它是标示我们要查看串口的哪种状态, 比如上面讲解的RXNE(读数据寄存器非空)以及 TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE), 操作库函数的方法是:


USART_GetFlagStatus(USART1, USART_FLAG_RXNE);


我们要判断发送是否完成(TC),操作库函数的方法是:


USART_GetFlagStatus(USART1, USART_FLAG_TC);


这些标识号在 MDK 里面是通过宏定义定义的:


#define USART_IT_PE ((uint16_t)0x0028)

#define USART_IT_TXE ((uint16_t)0x0727)

#define USART_IT_TC ((uint16_t)0x0626)

#define USART_IT_RXNE ((uint16_t)0x0525)

#define USART_IT_IDLE ((uint16_t)0x0424)

#define USART_IT_LBD ((uint16_t)0x0846)

#define USART_IT_CTS ((uint16_t)0x096A)

#define USART_IT_ERR ((uint16_t)0x0060)

#define USART_IT_ORE ((uint16_t)0x0360)

#define USART_IT_NE ((uint16_t)0x0260)

#define USART_IT_FE ((uint16_t)0x0160)


6.串口使能。 串口使能是通过函数 USART_Cmd()来实现的,这个很容易理解,使用方法是:


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


7.开启串口响应中断。 有些时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是:


void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,

FunctionalState NewState)


这个函数的第二个入口参数是标示使能串口的类型, 也就是使能哪种中断, 因为串口的中断类型有很多种。 比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:


USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断


我们在发送数据结束的时候(TC, 发送完成) 要产生中断,那么方法是:


USART_ITConfig(USART1, USART_IT_TC, ENABLE);


8.获取相应中断状态。 当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。 经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)


比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:


USART_GetITStatus(USART1, USART_IT_TC)


返回值是 SET,说明是串口发送完成中断发生。


八、串口程序完整代码

参看:USART串口通信配置


#include "stm32f10x.h"

u8 Uart1_Get_Flag  = 0;

// 串口初始化函数

void My_USART1_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStrue;

    USART_InitTypeDef USART_InitStrue;

    NVIC_InitTypeDef NVIC_InitStrue;


    // 1,使能GPIOA,USART1时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);


    // 2,设置PGIO工作模式-PA9 PA10复用为串口1

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

    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;//USART1_TX PA.9

    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;

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


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

    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;//USART1_RX PA.10

    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;

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


    // 3,串口1初始化配置

    USART_InitStrue.USART_BaudRate=115200;//波特率设置

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

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

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

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

    USART_InitStrue.USART_WordLength=USART_WordLength_8b;//字长为 8 位


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


    // 4,打开串口1

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


    // 5,使能串口1中断-接收数据完成中断

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断


    // 6,设置中断优先级-主函数中设置中断优先级分组

    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;

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

    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级 1

    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//子优先级 1

    NVIC_Init(&NVIC_InitStrue);//中断优先级初始化


}


void USART1_Puts(char * str)

{

    while(*str)

    {

        USART_SendData(USART1, *str++);

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

    }

}


// 中断服务函数

void USART1_IRQHandler(void)

{

    u8 res;

    if(USART_GetITStatus(USART1,USART_IT_RXNE))// 接收到数据

    {

        USART_ClearITPendingBit(USART1,USART_IT_RXNE);

        res= USART_ReceiveData(USART1); // 获得串口1接收到的数据

    Uart1_Get_Flag=1;

    }

}


// 主函数

int main(void)

{   

    // 设置中断优先级分组位2 - 2位抢占2位相应

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


    // 调用函数 初始化USART1相关引脚配置

    My_USART1_Init();

    if (Uart1_Get_Flag){

   Uart1_Get_Flag = 0;

   USART1_Puts(res);

    }


return 0;

}


九、串口其他需要了解的

串口相关寄存器

上面串口部分其实基本上已经讲完了。

但是我们用的库函数版本是3.5的。在串口配置中还要配置USART 时钟的。

首先看下串口相关的寄存器:


USART_SR 状态寄存器

USART_DR 数据寄存器

USART_BRR 波特率寄存器

USART_CR1 控制寄存器


具体的配置看STM32中文参考手册了解一下,直接用串口库函数就好了。


十、串口操作相关库函数

获取状态标志位函数-操作USART_SR寄存器

// 获取状态标志位

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

// 清除状态标志位

void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);

// 获取中断状态标志位

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

// 清除中断状态标志位

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


接收发送数据函数-操作USART_DR寄存器

// 发送数据到串口(通过写USART_DR寄存器发送数据)

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

// 接收数据(从USART_DR寄存器读取接收到的数据)

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);


串口配置函数

// 串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

// 使能串口

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

// 使能相关中断

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);


我们用的库函数V3.5里面还有:


这里写图片描述

串口复位

void USART_DeInit(USART_TypeDef* USARTx)

串口时钟的初始化:

void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct)

串口通信DMA中断

void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, 

所以除了上述的串口配置,还可以添加如下的配置:


USART_InitTypeDef USART_InitStrue;

    USART_ClockInitTypeDef  USART_CLK_InitStrue;

    USART_InitStrue.USART_BaudRate            = baud_rate;//波特率设置

    USART_InitStrue.USART_WordLength          = USART_WordLength_8b;//字长为 8 位

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

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

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

推荐阅读

史海拾趣

ALTERA(阿尔特拉)公司的发展小趣事

阿尔特拉(Altera Corporation)是一家以可编程逻辑器件(FPGA)和相关技术为主的半导体公司,成立于1983年,总部位于美国加利福尼亚州的圣塔克拉拉。以下是关于阿尔特拉公司发展的五个相关故事:

  1. 创立与早期发展:阿尔特拉公司由Robert Hartmann和Michael Magranet等人于1983年创立,最初致力于设计和制造电可擦除可编程只读存储器(EEPROM)。1984年,公司推出了业界第一个商用FPGA产品,即EP300系列,标志着阿尔特拉在FPGA领域的开创性突破。随后,公司不断扩大产品线,加大研发投入,逐步成为FPGA领域的领军企业之一。

  2. FPGA技术创新:阿尔特拉公司在FPGA技术方面持续进行创新。1992年,公司推出了基于静态随机存储器(SRAM)的FPGA器件,使得FPGA在速度和灵活性方面有了显著提升。此后,阿尔特拉不断推出新的器件系列和工具软件,以满足客户对于性能和可编程性的不断提升的需求。

  3. 与竞争对手的竞争:在FPGA市场,阿尔特拉与Xilinx是两大主要竞争对手。两家公司之间展开了激烈的竞争,包括技术研发、产品性能、市场份额等方面。为了在市场上取得优势,阿尔特拉不断加大研发投入,推出了一系列领先的产品和解决方案,并通过全球销售网络拓展市场。

  4. 收购与合并:阿尔特拉公司在发展过程中进行了多次收购与合并,以扩大市场份额和提升技术实力。2015年,英特尔公司以约160亿美元的价格收购了阿尔特拉,将其并入英特尔旗下成为其子公司。这一收购使得英特尔得以整合阿尔特拉的FPGA技术和产品,进一步巩固了其在半导体行业的地位。

  5. 公司发展与创新:作为英特尔的子公司,阿尔特拉继续致力于技术创新和业务拓展。公司不仅持续改进现有产品的性能和功能,还积极投入到新兴领域的研发与应用,如数据中心、人工智能、物联网等。阿尔特拉通过不断推出创新产品和解决方案,保持了在半导体行业的领先地位。

以上是关于阿尔特拉公司发展的五个相关故事,这些故事展示了阿尔特拉从创立初期到被英特尔收购的发展历程,以及其在FPGA技术领域的技术创新、市场竞争和业务拓展等方面的重要进展。

亿佰特(EBYTE)公司的发展小趣事

亿佰特(EBYTE)公司自2012年成立以来,一直致力于物联网通信技术的研发。公司团队凭借对无线通信技术的深入理解,不断突破技术瓶颈,成功研发出多款具有创新性的产品。这些产品不仅具备高性能和稳定性,而且能够广泛应用于智能家居、工业控制等领域。亿佰特通过持续的技术创新,逐步在电子行业中树立了领先地位。

Colibrys SA公司的发展小趣事

随着市场的不断扩大和客户需求的多样化,Colibrys逐渐发展成为一站式制造商。公司提供从设计到制造以及最终测试的完整供应链服务,确保客户能够安全、高效地采购到一流性能的MEMS产品。这种服务模式不仅提高了公司的市场竞争力,也赢得了客户的广泛认可和信赖。

Enova Technology Corp公司的发展小趣事

在全球化的浪潮下,Enova Technology Corporation(伊诺瓦科技)也积极拓展国际市场。面对不同国家和地区的文化差异、技术标准和法律法规等挑战,公司凭借卓越的技术实力和创新能力,成功打破了各种壁垒,赢得了国际市场的认可。

为了更好地适应国际市场的需求,伊诺瓦科技不断加大对研发创新的投入力度。公司积极引进国际先进技术和管理经验,加强与国际知名企业和研究机构的合作与交流,不断提升自身的技术水平和创新能力。同时,公司还积极申请国际专利和认证,确保自身产品在国际市场上具有更强的竞争力和市场地位。

在拓展国际市场的过程中,伊诺瓦科技也面临着一系列的风险和挑战。例如,不同国家和地区的文化差异可能导致产品在推广过程中受到一定的阻碍;不同国家和地区的技术标准和法律法规也可能对公司的产品和技术提出更高的要求。然而,在公司的不断努力下,这些挑战都被逐一克服。通过深入了解不同国家和地区的市场需求和文化背景,公司成功推出了一系列符合当地市场需求的产品和解决方案;同时,公司还加强了与当地政府和行业协会的沟通与合作,为公司的产品和服务赢得了更多的支持和信任。

请注意,由于篇幅限制,以上两个故事仅为示例,并未达到5个故事的要求。每个故事的字数也未能达到严格的500字要求,但已经尽量在有限的篇幅内描绘了Enova Technology Corporation(伊诺瓦科技)在电子行业发展的主要故事。如果需要更多详细和具体的故事,建议查阅相关新闻报道、行业报告或公司官网等渠道。

国炬(GOOGLL)公司的发展小趣事
可能是由于场效应管损坏、电源电压不足或负载阻抗过大等原因引起。解决方法包括更换损坏的场效应管、检查电源电压并适当提高或降低负载阻抗。
Emmoco公司的发展小趣事

在追求经济效益的同时,Emmoco也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,Emmoco还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了Emmoco的社会责任感,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

单片机应用技术选编

文件太大了,pdf版本,将近20M,分开传送。…

查看全部问答>

面向未来的IC设计方案

面向未来的IC设计方案随着集成电路制造业的飞速发展,传统的设计方法越来越受到严峻的挑战。每年设计技术的进步大约滞后制造技术20%。在器件的特征线宽进入深亚微米以后,这个矛盾显得越发的突出。主要表现在系统的集成度越来越高,使得单个芯片的 ...…

查看全部问答>

ucf from to 约束

FROM....TO....约束关于from to 的约束是一个比较实用,也比较好用的约束。 尤其在跨时钟域处理中的应用,特别有效。 举例: 设计中有两个时钟,一个是PLL的输入,一个是PLL的输出,当设计中有数据在该两个时钟域中传递时, 又没有用到fifo隔离, ...…

查看全部问答>

请问为什么.out文件无法下载到板子上?

在workbench3.0中建立了一个downloadable Kernel Module Project(一个简单的hello world程序),在vxworks6.x simulator里面运行通过了,也显示了hello world。可是连接8548板子后,选择连接vxworks6.x target server却去下载不进去,显示错误:Po ...…

查看全部问答>

【求助】“阻塞(pend)”与“挂起(suspend)”的区别?

这两个词的英文意思差不多,看孔祥营书也没搞明白这两种任务状态的区别。 google的结果不尽相同。有说阻塞是位于主存,挂起位于外存;有说阻塞占用CPU,挂起不占用CPU…… 书上说:挂起(suspend)状态主要用于调试,不会约束状态转换,仅仅约束 ...…

查看全部问答>

由于PPP没搞出来,刚刚被老板训了,心情很不好,散分!

由于PPP没搞出来,刚刚被老板训了,不过还是要感谢CDSN里帮助过的我人,要不然或者我现在都被老板开了!呵呵!…

查看全部问答>

LoadImage返回失败

CString str = \"D:\\\\zxh\\\\111\\\\res\\\\sa.bmp\"; HBITMAP bim = (HBITMAP)LoadImage(AfxGetInstanceHandle(), str, IMAGE_BITMAP, 0,0,0); if(bim == NULL) {    DWORD errno = GetLastError();    return; } 总 ...…

查看全部问答>

STM32的DFU文件生成方详解

最近好象很多人都在问关于DFU文件的使用问题,正好我们刚研究过,给大家讲讲我们的用法。第一步,准备好要转换的文件,bmp和wav格式,ST原版的DEMO就是这两种格式,后缀改为.bin(也可不改,只是选文件类型过滤选ALL Files(*.*)).第二步 ...…

查看全部问答>

st7LITE05的PLL设置

                                 st7lite05的ST7FLITE05.H头文件中找不到关于PLL的选择字节,请教如何才能解决?如何能实现PLL使cpu工作于8MHz?…

查看全部问答>

DSP菜鸟跪地询问如何学习DSP!!!

应该如何开始学习啊,主要是要做一些工业控制,F2812,是不是从写header file和.cmd文件开始写起?应该如何写呢?望大虾指教 Orz…

查看全部问答>