当前位置:首页 > 单片机 > 单片机
[导读]如果简单的使用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];

}


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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭