当前位置:首页 > 单片机 > 单片机
[导读]如果简单的使用USART的话配置相当简单,只要配置一下波特率,数据长度,停止位长度,校验位。然后再设置一下串口的引脚,输入为上后输入,输出为利用推挽输出。这样一来串口就配置好了,如果使用库则一目了然,如果使

如果简单的使用USART的话配置相当简单,只要配置一下波特率,数据长度,停止位长度,校验位。然后再设置一下串口的引脚,输入为上后输入,输出为利用推挽输出。这样一来串口就配置好了,如果使用库则一目了然,如果使用寄存器操作会繁琐一点找各个寄存器,因为设置波特率和设置数据长度等这些并不在一个寄存器中设置完成,还有可能忘记个别设置而无法找其原因。但寄存器操作的效率会很高。如下配置:

void USART_Initial(uint32_t Baud)

{

USART_InitTypeDef USART_InitStruct;

USART_GPIO(); //配置串口引脚

USART_InitStruct.USART_BaudRate=Baud; //波特率

USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据长度

USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位

USART_InitStruct.USART_Parity=USART_Parity_No;//奇偶校验

USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流失能

USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//使能接收和发送

USART_Init(USART1,&USART_InitStruct);

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

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开中断,本代码只在接收时用到

}

void USART_GPIO(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10);

}

我使能的USART1为PA9和PA10两个串口线。

如果使能到串口中断则在NVIC中设置好中断向量断并设置好优先级,并在串口寄存器中使能该中断。

void NVIC_USART_Initial(void)

{

NVIC_InitTypeDef NVIC_InitStruct;

NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;

NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStruct);

}

(中断优先级分组为2)

此时你可以在串口的中断服务代码中写入你想处理的代码。至于你想是接收中断还是发送中断或者传送错误中断还是奇偶校验,侦错误等中断你可以设置USART_ITConfig中设置,在void USART_Initial(uint32_t Baud)函数中最后一句第二个参数进行设置。

如果你想使能printf或者scanf来串口传输请看我的另一篇博文。http://blog.sina.com.cn/s/blog_79fbaced01011tpj.html

而串口的其它功能则没有用到,至于智能卡个人觉得应该挺有意思的,以后兴许会搞搞。而串口的同步模式不知道他和SPI比是不是速度更快,它的传输则由发送数据时产生CLK时钟和些时钟进行同步,接收数据也只有在此时才可以接收,也就是不可以独立的接收数据。

博主也试了串口DMA不中断是可以传输的,但是当我打开DMA传输完成中断时,发现串口没有数据,以为串口速度根不上DMA就提高了波特率发现还是不行。但当我使能DMA半传输中断时能够中断也能传输但是中断程序无法执行。。等高手回答。

下面则是ADC。因为实验仪上的ADC引脚引出来有限,所以很多功能未实现,首先就是ADCON这个东西一直有点混。一直以为使能此位这前校验ADC(手册上说校验ADC是ADCON=0必须在两个周期以上,但手册上又说ADCON=0时ADC消耗基本为0)后试过只有打开此位才可以校验。但是ADCON再次设置时可以启动ADC转换,手册上好像讲是启动规则转换,因为没有度过注入转换所以规则转换可以设置些位,也可以设置ADCx_CR2寄存器器中的外部触发来启动,规则通道则是先设置EXTSEL[2:0]位,如果设置成111即软件触发,后设置位20EXTTRIG位允许外部事件触发,最后设置位22SWSART来启动规则软件触发,而注入触发则同样设置CR2寄存器中的某些对应位来启动。

ADC有很多模式,而双ADC模式个人认为比较经典,或许见识有点少了。哈哈。这里不多说,为什么?没有经验,实验仪提供的资源多,但是随心的少。

SCAN模式,即扫描整个通道。如果规则通道组中有3个通道,则启动通道时转换完第一个自动转换第二个再然后第三个后停止并产生一个EOC事件,如果使能了中断则产生中断。(以前对中断头疼,现在觉得就是个纸老虎)

CONT即单词continue(本来看成count)当设置了SCAN又设置了CONT时将循环的转换通道,即上面转换完三后继续生第一个转换。同样的地方产生EOC。(应该是的,没有实践不敢断定)。

注入模式:一种是外部触发,优先于规则,如果有外部触发将打断正在转换的规则通道。直至完成。

自动注入模式:即转换完成规则通道后自动的切换到注入通道执行转换。

当然ADC还有很多,比如常常配合ADC的DMA。ADC时钟,外部触发的事件啊,等等细节。

配置ADC,这里不将时钟的打开,以上串口也未讲。

void ADC_Initial(void)

{

ADC_InitTypeDef ADC_InitStruct;

ADC_Cmd(ADC1,ENABLE); //启动ADC

System_Delay_us(100); //延时几个ADC周期

ADC_ResetCalibration(ADC1); //重置ADC校验

while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置完成

ADC_StartCalibration(ADC1); //校验ADC

while(ADC_GetCalibrationStatus(ADC1)); //等待校验完成

ADC_InitStruct.ADC_Mode=ADC_Mode_Independent; //独立模式

ADC_InitStruct.ADC_ScanConvMode=DISABLE; //非扫描模式,当有多个ADC通道须要转换时可以使能此位

ADC_InitStruct.ADC_ContinuousConvMode=ENABLE; //连续转换使能

ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //外部触发条件,这里为软件触发

ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right; //右对齐模式

ADC_InitStruct.ADC_NbrOfChannel=1; //规则通道的个数,放在SQR寄存器的L[3:0]中

ADC_Init(ADC1,&ADC_InitStruct);

ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5); //开启通道10写入规则通道中,并设置第几个转换,转换周期为239

}

以上函数可以参考库手册。

再执行完ADC_Cmd(ADC1,ENABLE);这条语句就可以读通道10的AD转换值了。12位AD值在0~4096之间。然后将这些值打印到串口看其变化。你会发现变化波动还是较大的。可能极差并不会太大。你可以自己进行滤波。

昨天洗完澡回来后并无睡意,所以写了个滤波,但没什么新意,只是不厌其烦的取平均值。最后可以使AD值变化最大的情况下只有一个值的变化,一般情况下采样值都会是同一个值。但这样就大大(很大)牺牲了采样灵敏度。

不过这样的采样滤波不科学。有兴趣的同学可以上网搜下常见的AD的10大软件滤波程序。比较经典。

以下是一个简单的滤波代码。牺牲了速度。

#define GetValueTimes 30

#define DeleteValue 10

uint16_t ADC_GetValue(void)

{

uint8_t i,j;

uint16_t DigitalValue[GetValueTimes],SwapTreg;

uint32_t CalValue=0;

for(i=0;i

{

DigitalValue[i]=ADC_GetConversionValue(ADC1);

}

for(i=0;i

{

for(j=i+1;j

{

if(DigitalValue[i]>DigitalValue[j])

{

SwapTreg=DigitalValue[i];

DigitalValue[i]=DigitalValue[j];

DigitalValue[j]=SwapTreg;

}

}

}

for(i=DeleteValue,j=0;i

{

DigitalValue[j]=DigitalValue[i];

}

for(i=0;i

{

CalValue+=DigitalValue[i];

}

CalValue=CalValue/i;

return (uint16_t)CalValue;

}

#define SampleTimes 10

uint16_t MoveMix(void)

{

uint16_t SampleBuffer[SampleTimes];

uint8_t i,j;

uint32_t CalValue=0;

Lable: for(i=0;i

{

SampleBuffer[i]=ADC_GetValue();

}

for(i=0;i

{

for(j=i;j

{

if(abs(SampleBuffer[i]-SampleBuffer[j])>=20)goto Lable;

}

}

for(i=0;i

{

CalValue+=SampleBuffer[i];

}

CalValue/=i;

return (uint16_t)CalValue;

}

#define SampleTimes2 10

uint16_t MoreMix(void)

{

uint8_t i;

uint32_t CalValue=0;

for(i=0;i

{

CalValue+=MoveMix();

}

CalValue/=i;

return (uint16_t)CalValue;

}

#define SampleOver 5

uint16_t OverMix(void)

{

uint8_t i;

uint16_t OverValue[SampleOver];

Lable2: for(i=0;i

{

OverValue[i]=MoreMix();

}

for(i=0;i

{

if(OverValue[i]!=OverValue[i+1])goto Lable2;

}

return OverValue[0];

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器

串行通信需要传输的数据通过调制器(Modulator)将数据转换为模拟信号,经过信号调制(Modulation)后在传输线上传输,接收端通过解调器(Demodulator)将信号解码还原成原始数据。

关键字: 串口 串行通信 并行通信

STM32是一种广泛使用的微控制器,具有丰富的通信接口。其中,串口通信是STM32与其他设备或系统进行数据交换的重要方式之一。本文将详细介绍STM32串口通信的原理、应用及常见故障。

关键字: STM32 串口通信

由于目前缺乏相应的监测技术,地下电缆线路出现异常运行状态无法被及时发现,久而久之易演变成大故障,最终只能通过更换地下电缆进行修复,耗费大量的人力、物力。鉴于此,开发了一种基于STM32的地下电缆异常状态检测系统,利用热传...

关键字: STM32 地下电缆
关闭
关闭