历史上的今天
返回首页

历史上的今天

今天是:2025年04月10日(星期四)

正在发生

2019年04月10日 | STM32F103利用定时器2与串口接收指令控制LED亮度

2019-04-10 来源:eefocus

通过串口接收到的数据改变PA8输出的占空比来控制LED小灯的亮度


主函数


char *str_light = "LIGHT:";

unsigned char PWM_BUF = 0;

 

int main(void)

{

PWM_Init();

USART3_TIM2_Init(115200);

delay_init();

while(1)

{

if(RX_SATA == 1)

{

if(strstr(RX_BUF,str_light) != 0)

{

delay_ms(1);

PWM_BUF =(RX_BUF[6]-0x30)*10+(RX_BUF[7]-0x30);

TIM_SetCompare1(TIM1,PWM_BUF);

}

RX_SATA = 0;

count = 0;

memset(RX_BUF,0,strlen(RX_BUF));

}

}

}

配置USART3和TIM2


char RX_BUF[20] = {0};

u8 count = 0;

u8 RX_SATA = 0;// 0表示接受未完成 ;1表示接收完成

 

void USART3_TIM2_Init(u32 bound)

{

NVIC_InitTypeDef NVIC_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

 

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;


//开启GPIOB 和 复用功能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

//开启USART3的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);


//PB10 ->Tx 配置为复用推挽式输出 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);


//PB11 ->Rx 配置为浮空输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

//配置串口

USART_InitStructure.USART_BaudRate = bound;

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_Tx | USART_Mode_Rx;

USART_Init(USART3, &USART_InitStructure);

 

USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//配置串口接收为中断模式


 

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);


USART_Cmd(USART3,ENABLE);


USART_GetFlagStatus(USART3,USART_FLAG_TC);//防止第一个字符被吞


//使能定时器2的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);


 

TIM_TimeBaseStructure.TIM_Period = (100-1);//ARR

TIM_TimeBaseStructure.TIM_Prescaler = (7200-1);//PSC

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);

 

//使能定时器2的中断

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);


//配置定时器2的中断优先等级

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

//使能定时器2

TIM_Cmd(TIM2,DISABLE);


}

void USART3_IRQHandler(void)

{

USART_ClearFlag(USART3,USART_FLAG_RXNE);

RX_BUF[count] = USART_ReceiveData(USART3);

count++;

TIM_SetCounter(TIM2,0);

TIM_Cmd(TIM2,ENABLE);

}

 

void TIM2_IRQHandler(void)

{

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

TIM_Cmd(TIM2,DISABLE);

RX_SATA = 1;

}

配置PWM


void PWM_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;


//初始化PA8管脚为复用推挽式输出


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

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

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

//初始化定时器1的时基单元


//使能定时器1的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);



TIM_TimeBaseStructure.TIM_Period = (100-1);//ARR

TIM_TimeBaseStructure.TIM_Prescaler = (72-1);//PSC

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM1, & TIM_TimeBaseStructure);

 

//初始化PWM输出配置

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;


TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;


TIM_OCInitStructure.TIM_Pulse = 0;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

 

TIM_OC1Init(TIM1,&TIM_OCInitStructure);


//使能PWM外设

TIM_CtrlPWMOutputs(TIM1,ENABLE);


//激活CCR寄存器

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);


//激活ARR寄存器

TIM_ARRPreloadConfig(TIM1,ENABLE);


//使能定时器1

TIM_Cmd(TIM1,ENABLE);


}

推荐阅读

史海拾趣

ASM公司的发展小趣事

进入21世纪,ASM公司开始关注中国市场的潜力。随着中国经济的快速增长和半导体产业的蓬勃发展,ASM公司看到了巨大的商机。公司加大了对中国市场的投入,与中国半导体代工厂建立了紧密的合作关系,为中国市场提供了高质量的产品和服务。这一举措不仅促进了ASM公司在中国市场的快速发展,也为中国半导体产业的进步做出了贡献。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:在21世纪初,电子产品市场迅速增长,智能手机和平板电脑等移动设备成为新宠。Hisetec Electronic Co Ltd公司凭借其在微电子封装技术的深厚积累,成功研发出一种高密度、低功耗的封装解决方案,大幅提升了手机芯片的能效比。

发展:该技术迅速被市场认可,多家知名手机制造商如三星、苹果等纷纷采用,Hisetec公司因此订单激增,市场份额大幅提升。公司不仅扩大了生产规模,还进一步加大了研发投入,不断推出新的封装技术,巩固了其在电子封装领域的领先地位。

GSR Technology Ltd公司的发展小趣事

随着技术的成熟和市场的认可,GSR Technology Ltd开始寻求国际合作机会,以进一步扩大其市场影响力。公司与欧洲一家知名雷达制造商达成战略合作,共同开发面向全球市场的先进GSR系统。这一合作不仅提升了公司的产品竞争力,还为公司打开了欧洲市场的大门。随后,公司逐步在北美、亚洲等地设立分支机构,实现了全球化布局。

Display Engineering Services公司的发展小趣事

在快速发展的同时,GSR Technology Ltd始终关注可持续发展和社会责任。公司积极推动绿色生产,采用环保材料和工艺,减少对环境的影响。同时,公司积极参与公益事业,为贫困地区提供技术支持和教育援助。此外,公司还加强知识产权保护,维护行业健康发展。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在展示一个类似公司在电子行业中的可能发展路径。实际情况可能因公司具体策略、市场环境等因素而有所不同。

ebm-papst公司的发展小趣事

为了更好地服务中国市场,ebm-papst在中国不断推进本地化生产。公司在上海和西安设立了研发中心和生产基地,配备了与德国同样先进的实验设备。这些本地化生产和研发设施使得ebm-papst能够更快地响应中国市场的需求,提供更符合当地市场特点的产品和解决方案。同时,本地化生产也降低了公司的生产成本,提高了产品的竞争力。

台湾丰宾(CapXon)公司的发展小趣事

面对日益激烈的市场竞争,CapXon公司始终坚持以技术创新为驱动,不断推动产业升级。公司投入大量资金用于研发新的技术和产品,以满足市场对高品质、高性能电容器的需求。通过不断的努力,CapXon成功研发出了一系列具有自主知识产权的高性能电容器产品,这些产品不仅具有更高的稳定性和可靠性,而且能够满足更广泛的应用场景需求。

问答坊 | AI 解惑

一些常用小软件下载

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 这里是我们竞赛成用的一些小软件下载 大家有兴趣的可以看看  …

查看全部问答>

求:单片机串口转USB的免驱动方案

求:单片机(Freescale MC13213)串口转USB的免驱动方案!!可以用2块转换芯片!…

查看全部问答>

关于ARM中断处理的问题----《ARM嵌入式系统开发-软件设计与优化》第九章中疑问

各位过年好哦~ 呵呵,小弟这里有点疑惑相同大家讨论讨论~,这个问题是《ARM嵌入式系统开发-软件设计与优化》一书中的见下: 第九章-中断处理 9.3.2嵌套中断 在这一节中,描述了如何处理嵌套式的中断(不能单纯的在IRQ模式下打开中断允许位) ...…

查看全部问答>

求教wince 5.0 扩展16550串口的问题

找了一些资料,但还是有点不明白, http://topic.eeworld.net/u/20090319/17/48afc467-5061-476c-ac41-5a0f8fdd4622.html这位仁兄也问了差不多的问题 方法是不是主要将%_WINCEROOT%\\Public\\Common\\Oak\\Drivers\\Serial\\COM16550目录复制到 ...…

查看全部问答>

This file should only be compiled with iccavr or aavr with processor option -v1

#error This file should only be compiled with iccavr or aavr with processor option -v1 有人用IAR AVR遇到过这个问题吗?…

查看全部问答>

无线电通信

RT 无线电通信怎么入门啊~~~…

查看全部问答>

ECC检验有什么优势,我不明白,请玩过Nand flash 的朋友谈谈

搞了半天都没明白ECC的原理是什么?但根据网友提供的代码,基本上知道怎么去调用它,但我有点纳闷:还不如自己写完一个Sector后,写个函数再读出这个扇区一个一个字节与原数据做比较,不一一对应,擦除再写,直到写对为止,难道ECC算法查到某位写错后,不用经 ...…

查看全部问答>

设计家用电器电路控制板时的EMC方法

家电控制板的小体积,低成本决定了在线路中不会使用高成本的材料来解决其电磁干扰问题。家电控制板的干扰主要来自三大方面:一是控制板本身产生的干扰,二是来自负载的干扰,三是来自线路上的干扰。解决这些干扰可以分别采用不同的方案来达成。 控 ...…

查看全部问答>

请教,stm8a的芯片,有没有位寻址功能,求解用过大侠们

                                 请教,stm8a的芯片,有没有位寻址功能,我看没大量资料,没有看到有关说明,求解用过大侠们~~~~~~~~~~~~~~~~~~~~~~ ...…

查看全部问答>

OV系列摄像头配置格式如何解释?

FPGA的I2C对摄像头配置怎么没有地址,只有数据呢。谁能解释下。///////////// Config Data LUT  ////////////////////////// alwaysbegin case(LUT_INDEX) // Audio Config Data 0 : LUT_DATA <= 16\'h0000; 1 : LUT_DATA <= 16\'h1140; ...…

查看全部问答>