历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2019年01月14日 | STM32+按键调控PWM输出+串口输出占空比

2019-01-14 来源:eefocus

GPIO.c

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"

/*******************************************************************************
* Function Name  : GPIO_Configuration
* 设置PD3,PD4,PD5,PD6为键盘输入
* 设置PB0,5,8,9; PC5,7; PD7 ;PA8 为输出LED灯
*******************************************************************************/
void GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 
 /*允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟.
 从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,
 这是STM32节能的一种技巧,*/
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

 /* PC8按键输入*/
 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
 GPIO_Init(GPIOC, &GPIO_InitStructure);

 /* PC9按键输入*/
 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
 GPIO_Init(GPIOC, &GPIO_InitStructure);
}

hal.h


#ifndef HAL_H
#define HAL_H

//硬件初始化
extern void  ChipHalInit(void);
extern void  ChipOutHalInit(void);


//输入宏定义
#define GET_LEFT() (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8))
#define GET_RIGHT() (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9))
extern void USART1_Putc(u8 c);
extern void USART_Configuration(void);
extern void USART1_Puts(char * str);

#endif

TIM.c


#include "STM32Lib\\stm32f10x.h"

void Tim1_Configuration(void)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;

 GPIO_InitTypeDef GPIO_InitStructure;

 /* PA8设置为功能脚(PWM) */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
 GPIO_Init(GPIOA, &GPIO_InitStructure);


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

 
 TIM_DeInit(TIM1);

 /*TIM1时钟配置*/
 TIM_TimeBaseStructure.TIM_Prescaler = 72;      //预分频(时钟分频)72M/72=1000K
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
 TIM_TimeBaseStructure.TIM_Period = 2000;       //装载值 1000k/2000=500hz
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

 /* Channel 1 Configuration in PWM mode */
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;     //PWM模式2
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //正向通道有效
 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道无效
 TIM_OCInitStructure.TIM_Pulse = 300;        //占空时间
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   //输出极性
 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     //互补端的极性  
 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; 

 TIM_OC1Init(TIM1,&TIM_OCInitStructure);       //通道1
 

 /* TIM1 counter enable */
 TIM_Cmd(TIM1,ENABLE);
 
 /* TIM1 Main Output Enable */
 TIM_CtrlPWMOutputs(TIM1,ENABLE);
}

//设置捕获寄存器1
void SetT1Pwm1(u16 pulse)
{
 TIM1->CCR1=pulse;
}

 

main.c


/************************************************************
**实验名称:PWM
**功能:是PA8产生PWM输出,按键调节占空比
*************************************************************/

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#define SIZE 0
u8    table[11]={"0123456789 "};
char buffer[10]={"0000000000"};
void Delay(u16 n);

void d_2_char(u32 x)
{
 buffer[SIZE+0]=table[x%10000000000/100000];
 buffer[SIZE+1]=table[x%1000000000/100000];
 buffer[SIZE+2]=table[x%100000000/100000];
 buffer[SIZE+3]=table[x%10000000/10000];
 buffer[SIZE+4]=table[x%1000000/10000];
 buffer[SIZE+5]=table[x%100000/10000];
 buffer[SIZE+6]=table[x%10000/1000];
 buffer[SIZE+7]=table[x%1000/100];
 buffer[SIZE+8]=table[x%100/10];
 buffer[SIZE+9]=table[x%10];
}


//延迟函数
void Delay(u16 speed)
{
 u16 i;
 while(speed!=0)
 {
  speed--;
  for(i=0;i<400;i++);
 }
}
extern void SetT1Pwm1(u16 pulse);

int main(void)
{
 u16 pulse=300;
 ChipHalInit();   //片内硬件初始化
 ChipOutHalInit();  //片外硬件初始化
 
 for(;;)
 {
  if(GET_LEFT()==0)
  {
   while(GET_LEFT()==0);
   if(pulse<=2000)
   {
    pulse+=30;
   // SetT1Pwm1(pulse);
   }
   else
   {
    pulse=300;
   }
        d_2_char(pulse);
  USART1_Puts(buffer);
  USART1_Puts("\r\n");

  }

  if(GET_RIGHT()==0)
  {
   while(GET_RIGHT()==0);
   if(pulse<=2000)
   {
    pulse-=60;
    
   }
   else
   {
    pulse=1800;
   }

  d_2_char(pulse);
  USART1_Puts(buffer);
  USART1_Puts("\r\n");

  }
  SetT1Pwm1(pulse);
  
 }
 
 
}


推荐阅读

史海拾趣

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

在电子薄膜电容器领域,EFC公司一直以其技术创新而闻名。公司创始人李博士带领着一支由资深工程师组成的研发团队,不断挑战技术极限。某年,他们成功研发出一种新型材料,这种材料不仅大大提高了电容器的性能,还降低了制造成本。这一突破性的创新使EFC公司在市场上脱颖而出,赢得了大量客户的青睐。

APLUS Products公司的发展小趣事

APLUS Products公司始终重视品牌建设和文化传播。公司不仅注重产品的质量和性能,还积极参与各类行业展会和公益活动,提升品牌知名度和美誉度。同时,公司还通过社交媒体等渠道与消费者进行互动,传递公司的价值观和企业文化。这些举措不仅增强了消费者对品牌的认同感和忠诚度,也为公司的长期发展奠定了坚实的基础。


这些故事虽然是根据一般情况构建的,但它们反映了企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场布局、合作共赢、品牌建设和文化传播等手段来实现企业的发展目标。希望这些故事能够为您提供一些启示和参考。如果您需要更具体的信息,建议您查阅APLUS Products公司的官方网站或相关新闻报道。

Endicott Research Group Inc (ERG)公司的发展小趣事

自1979年起,Endicott Research Group(ERG)就开始涉足电源转换产品的制造领域。在初创时期,公司面临着资金紧张和技术挑战,但团队坚持创新,专注于为LCD背光供电的LED驱动器及相关电源设备的研发。通过不断的试验和改进,他们成功地开发出了一系列高效稳定的产品,为公司的后续发展奠定了坚实的基础。这一时期的艰苦奋斗和技术积累,成为了ERG发展历程中的重要篇章。

海芯科技(AVIA)公司的发展小趣事

面对电子行业的快速变化和市场竞争的加剧,海芯科技始终保持着对技术创新的追求和投入。公司不断引进新技术、新工艺和新材料,对现有产品进行升级和改进,同时也在不断探索和研发新的产品和技术。这些技术升级和创新发展不仅提升了公司的核心竞争力,也为公司在未来市场竞争中保持领先地位提供了有力保障。

这五个故事展示了海芯科技在电子行业中的发展历程和取得的成就。通过不断的努力和创新,海芯科技已经逐渐成为了电子行业中的佼佼者,为行业的发展做出了积极的贡献。

Charcroft Electronics Ltd公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Charcroft Electronics Ltd公司开始积极拓展国内外市场。公司加强与国际知名企业的合作,通过参加国际电子展会、举办技术研讨会等方式,提升品牌知名度和影响力。同时,公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步巩固和扩大市场份额。

Box Enclosures公司的发展小趣事

随着电子行业的快速发展,市场对机箱和外壳产品的要求也越来越高。Box Enclosures公司敏锐地捕捉到了这一市场变化,开始加大在技术研发上的投入。公司成功开发出一系列具有创新性的产品,不仅满足了市场的需求,还引领了行业的发展方向。这些技术创新为Box Enclosures公司带来了更多的商业机会和市场份额。

问答坊 | AI 解惑

基于MPC5xx的高压共轨柴油机电控单元设计

给各位同仁介绍一个好论坛,里面有很多免费维普(VIP)QIKAN、CNKI、万方和超星账号与密码。 http://www.lwheart.cn/bbs/index.php?fromuser=121555…

查看全部问答>

带有dma和中断的wavedev2驱动程序,在dm中无法激活,请牛人来分析一下

我改编了wavedev2的音频驱动模型,产生了dll,用dumpbin查看,里面导出了WAV_init等函数。 我在DM中把模拟器自带的audio驱动的prefix从“WAV”改成了“ABC”,保存并重启。 然后加载了自己的dll,但是无法激活,提示ERR CODE 87:incorrect param ...…

查看全部问答>

学习DDK产生的一个疑问

1、DDK的帮助文档中说读写请求由功能驱动完成,而不是由总线驱动完成 2、DDK又说到只有总线驱动合适提供StarIO例程,在该例程中访问硬件完成读写请求。 这不是个矛盾吗? …

查看全部问答>

请教一个关于framebuffer的操作问题?欢迎大家讨论

我现在把framebuffer设置为1280X720, 然后我在写buffer的时候,写进去的是一张:720X480的图片 这样的画这个图片只会显示在左上脚,我要如何设置才能让这个图片全屏显示?谢谢...…

查看全部问答>

请问测量皮肤电阻的测谎器量测原理

请问一下,像电影里面在用的那些测谎器的原理应该是测量食指和中指间的皮肤电阻, 在网路上可以找到一些简易型的测谎器电路,但不知道专业型的都是用哪种原理来测量的, 有大侠能够分享一下皮肤电阻量测的技术或电路图吗?谢谢。…

查看全部问答>

太多的广告了!

论坛太多的广告了,花里胡梢的…

查看全部问答>

stm32关于K9F1G08U0M的读写程序

stm32103外接K9F1G08U0M,求一下例程…

查看全部问答>

关于MSP430中断机制

1.中断嵌套,优先级430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源 ...…

查看全部问答>