初级会员

- 积分
- 116
- 金钱
- 116
- 注册时间
- 2019-10-16
- 在线时间
- 18 小时
|
两个c文件访问同一个全局变量
(1)不用头文件
在file_a.c中定义一个全局变量:int flag ;
在file_b.c中:extern int flag;即可。
(2)利用头文件
在file_a.c中定义一个全局变量:int flag;
在common.h中定义:extern int flag;
然后在file_b.c中包含common.h文件即可。
注:file_a.c中不可包含头文件common.h。
我们使用STM32输出PWM时会使用定时器的PWM输出模式来进行生成,但是这样子生成PWM是有局限的,它只能生成四路频率相同的PWM,当你设定了TIMx_PSC(预分频寄存器)和TIMx_ARR(自动重装载寄存器),这时PWM的频率就被定下来了,为系统的时钟/TIMx_PSC+1/TIMx_ARR+1,你可以通过改变各个通道的CCR寄存器来改变占空比。但是如果我们想生成多路不同频率的PWM的话,使用这个方法只能使用多个定时器了,这样对于定时器资源较少的板子无疑是不可取的
<=、>= 是关系运算符,
&&、|| 是逻辑运算符
关系运算符的优先级大于逻辑运算符,所以会优先计算四个大小判断,假设x = 10;
原来的表达式:
x >= 1 && x <= 10 || x >= 200 && x <= 210
在执行完关系运算以后:
1 && 1 || 0 && 0
在这个表达式中,又因为&&运算符比||运算符的优先级高一级,所以会先进行&&运算,表达式变成:
1 || 0
最后进行 || 运算,得到结果:
1
简单说就是如果是多个else if的话,只要第一个if条件成立,即使满足else if的条件也不会执行else if及else的内容,如果是多个if的话,最后的else会执行的;else与最近的if匹配,包括else if 的if
led.h
- #ifndef __LED_H
- #define __LED_H
- void LED_Init(void);
- #define LED0 PBout(5)
- #define LED1 PEout(5)
- #endif
复制代码
led.c
- #include "led.h"
- #include "stm32f10x.h"
- void LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOA和GPIOB
- //| 既是逻辑运算符也是位运算符;|| 只是逻辑运算符
- //| 不具有短路效果,即左边true,右边还会执行;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_5);
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOE,&GPIO_InitStructure);
- GPIO_SetBits(GPIOE,GPIO_Pin_5);
- }
复制代码
key.h
- #ifndef __KEY_H
- #define __key_h
- #include "sys.h"
- #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
- #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
- #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)
- #define KEY0_PRES 1 //KEY0按下
- #define KEY1_PRES 2 //KEY1按下
- #define WKUP_PRES 3 //KEY_UP按下(即WK_UP/KEY_UP)
- void KEY_Init(void);//IO初始化
- u8 KEY_Scan(u8); //按键扫描函数
- #endif
复制代码
key.c
pwm.h
- #ifndef __PWM_H
- #define __PWM_H
- #include "sys.h"
- void TIM3_PWM_Init1(u16 arr,u16 psc);
- void TIM3_PWM_Init2(u16 arr,u16 psc);
- #endif
复制代码
pwm.c
- #include "pwm.h"
- void TIM3_PWM_Init1(u16 arr,u16 psc)//PA.7
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStructure);
- //GPIO_SetBits(GPIOA,GPIO_Pin_1);
-
- //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
-
- TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInitstruct.TIM_Period=arr;
- TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
- TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1
-
- TIM_Cmd(TIM3, ENABLE);
-
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
- //TIM_ARRPreloadConfig(TIM3,ENABLE);//为什么正点原子的教程里没有加这个函数,可没有这个除了例程别的引脚都没法动,加了一次之后就不需要要能控制舵机了
- }
- void TIM3_PWM_Init2(u16 arr,u16 psc)//PA.6
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStructure);
- //GPIO_SetBits(GPIOA,GPIO_Pin_1);
-
- //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
-
- TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInitstruct.TIM_Period=arr;
- TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
- TIM_OC1Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1
-
- TIM_Cmd(TIM3, ENABLE);
-
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
- //TIM_ARRPreloadConfig(TIM3,ENABLE);//为什么正点原子的教程里没有加这个函数,可没有这个除了例程别的引脚都没法动,加了一次之后就不需要要能控制舵机了
- }
复制代码
timer.h
- #ifndef __TIMER_H
- #define __TIMER_H
- #include "sys.h"
- void TIM2_Init(u16 arr,u16 psc);
- #endif
复制代码
timer.c
- #include "timer.h"
- #include "led.h"
- void TIM2_Init(u16 arr,u16 psc)
- {
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
-
- TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInitstruct.TIM_Period=arr;
- TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstruct);
-
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //使能按键TIME2所在的中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能TIM3中断通道
- NVIC_Init(&NVIC_InitStructure);
- TIM_Cmd(TIM2, ENABLE);
-
- }
复制代码
main.c
- #include "usart.h"
- u16 count=0;
- u16 mark1=0;
- u16 mark2=0;
- u16 flag1=0;
- u16 flag2=0;
- int main()
- {
-
- //u16 delay_time=500;
- /*
- u16 i;
- u16 angle=57;
- u16 angle2=57;
- */
- //u16 times=0;
-
- delay_init();
-
- LED_Init();//多用了1个led初始化按键控制就有用了,原来是我忘记调用KEY_Init()函数,我TMD
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- TIM3_PWM_Init1(199,7199);
- TIM3_PWM_Init2(199,7199);//这个改成59的时候为什么就不行了,同一个定时器只能生成一种PWM,不是一个
-
- uart_init(115200);
- KEY_Init();
- TIM2_Init(9,7199);//有这个时不会运行,为啥这个有错会影响后面的呢,函数里面参数没全部改过来
-
- while(1)
- {
-
-
- /*
- if(count%500==0||1==KEY_Scan(1)||2==KEY_Scan(1)||3==KEY_Scan(1)||4==KEY_Scan(1))//为什么按下按键就不执行这个语句了,不打印,灯不闪,这个按键返回值有问题,好了,count计数到500的时候可能没有运行到这
- { //同时按两个按键停了
- printf("%d %d %d %d/r/n",KEY_Scan(1),mark1,mark2,count);
- //LED0=!LED0;
- }
- */
-
- //我的按键函数写的太复杂了,可以简化成
- /*
- if(KEY0==0)
- {
- if(flag1==0)
- {
- mark1=count;
- flag1=1;
- }
- if(count-mark1>=0)
- {
- TIM_SetCompare1(TIM3,185);
- }
- }
- else
- {
- TIM_SetCompare1(TIM3,185);
- flag1=0;
- }
-
- if(KEY1==0)
- {
- if(flag2==0)
- {
- mark2=count;
- flag2=1;
- }
- if(count-mark1>=0)
- {
- TIM_SetCompare1(TIM3,185);
- }
- }
- else
- {
- TIM_SetCompare1(TIM3,185);
- flag2=0;
- }
- */
-
-
-
-
-
-
- if((count-mark1>=1000)&&(flag1==1))
- {
- TIM_SetCompare1(TIM3,185);
- }
- if((count-mark2>=1000)&&(flag2==1))
- {
- TIM_SetCompare2(TIM3,185);
- }
- if(1==KEY_Scan(1))
- {
- if(flag1==0)
- {
- mark1=count;
- flag1=1;
- }
- if(flag2==1)
- flag2=0;
- TIM_SetCompare2(TIM3,195);
- }
- if(2==KEY_Scan(1))
- {
- if(flag2==0)
- {
- mark2=count;
- flag2=1;
- }
- if(flag1==1)
- flag1=0;
- TIM_SetCompare1(TIM3,195);
- }
-
- if(3==KEY_Scan(1))
- {
- if(flag2==0)
- {
- mark2=count;
- flag2=1;
- }
- }
- if(4==KEY_Scan(1))
- {
- if(flag1==0)
- {
- mark1=count;
- flag1=1;
- }
- }
- if(0==KEY_Scan(1))
- {
- flag1=0;
- flag2=0;
- TIM_SetCompare1(TIM3,195);
- TIM_SetCompare2(TIM3,195);
- }
- /*
- if(count%500==0)
- {
- printf("%d %d %d %d %d\n",count,mark1,mark2,flag1,flag2);
- }
- */
-
- /*
- if(times%100==0)
- {
- printf("%d %d %d\n",count,mark1,mark2);
- LED0=0;
-
- }
- times++;
- delay_ms(20);
- if(times%200==0)
- {
- printf("1111");
- LED0=1;
- }
- */
-
-
- /*即时按键控制
- if(1==KEY_Scan(1))
- {
- TIM_SetCompare2(TIM3,185);
- delay_ms(delay_time);
- LED0=0;
- }
- TIM_SetCompare2(TIM3,195);
- if(2==KEY_Scan(1))
- {
- TIM_SetCompare1(TIM3,185);
- delay_ms(delay_time);
- LED0=0;
- }
- TIM_SetCompare1(TIM3,195);
- */
-
-
-
- /*
- KEY_Scan(0);
- if(count-mark1==1000)
- {
- TIM_SetCompare2(TIM3,185);
- }
- if(count-mark2==1000)
- {
- TIM_SetCompare1(TIM3,51);
- }
- */
- /*
- for(i=0;i<4;i++)
- {
- delay_ms(delay_time);
- TIM_SetCompare2(TIM3,angle);
- angle-=5;
- }
- for(i=0;i<4;i++)
- {
- delay_ms(delay_time);
- TIM_SetCompare2(TIM3,angle);
- angle+=5;
- }
-
- for(i=0;i<4;i++)
- {
- delay_ms(delay_time);
- TIM_SetCompare1(TIM3,angle2);
- angle2-=5;
- }
- for(i=0;i<4;i++)
- {
- delay_ms(delay_time);
- TIM_SetCompare1(TIM3,angle2);
- angle2+=5;
- }
- */
-
- /*
- if(1==KEY_Scan(1))//mode=0时可以返回0,mode=1时返回1,没按键
- {
- TIM_SetCompare2(TIM3,185);
- delay_ms(delay_time);
- LED0=0; //多用LED指示状态,为什么led不亮
- }
-
- if(2==KEY_Scan(1))//mode=0时可以返回0,mode=1时返回1,没按键
- {
- TIM_SetCompare1(TIM3,185);
- delay_ms(delay_time);
- LED0=0; //多用LED指示状态,为什么led不亮
- }
-
- TIM_SetCompare2(TIM3,180);
- delay_ms(delay_time);
- TIM_SetCompare2(TIM3,175);
- delay_ms(delay_time);
- TIM_SetCompare1(TIM3,180);
- delay_ms(delay_time);
- TIM_SetCompare1(TIM3,175);
- delay_ms(delay_time);
- LED0=1;
- LED1=0;
-
- */
- /*
- if(2==KEY_Scan(0))
- {
- TIM_SetCompare1(TIM3,185);
- delay_ms(delay_time);
- }
- */
- }
-
- }
复制代码
|
|