OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6015|回复: 7

我想把ADC的程序里,同时加进pwm输出,和中断调pwm的占空比,可代码放在一起以后,lcd就白屏了,pwm也没有输出了,是管脚冲突了吗

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-6-4 09:55:45 | 显示全部楼层 |阅读模式
5金钱
adc输入我用了PA.1  pwm我用PA.7    液晶显示的,好像也没用到GPIOA啊,
去掉TIM3_Configuration();
和按键中断的初始化代码 
 STM_EVAL_PBInit(Button_KEY0, Mode_EXTI); //设置按键外部中断方式

STM_EVAL_PBInit(Button_KEY1, Mode_EXTI); //设置按键外部中断方式
STM_EVAL_PBInit(Button_WAKEUP, Mode_EXTI); 
  // TIM_SetCompare2(TIM3,led0pwmval);
ADC 液晶都能正常运行,随便加入一个就不行了,各位大侠帮帮忙吧


代码如下

/**********************************************
File Name: ALIENTEK MINISTM32 实验13 ADC实验(库)
Revision:
Corporation:
Microcontroller Corporation:ST
Microcontroller name:STM32F103RBT6 ARM
Compiler: Keil MDK_ARM 4.11
Author: moweidong
E-mail: moweidongsabbit@21cn.com
Date : 2010.12.05
*********************************************/
//仿真仪器设备:
//ALIENTEK_MiniSTM32_REVB0开发板
//JTAG V7
/*********************************************
//库
//CMSIS:V1.20
//STM32F10x_StdPeriph_Driver:V3.1.1
*********************************************/

//本程序使用了printf用于在LCD和串口显示数据,因些对Option for Target属性有如下更改
//Target选项页:勾中Use MicroLIB(使用微库)

//LED0A8
//LED1D2


//用杜邦线把3V3的电压引入到PA0端口中
//使用SW调试模式,如使用JTAG JTAG下载的下载完后请拔走JTAG

//注意:在禁用JTAG接后后可这样恢复:
//1.设置KEIL为JTAG或SW下载模式
//2.给板上电,按下板上的复位按键不放,点击KEIL下的FLASH下载按钮,使JTAG或SW下载工具检测完成接口后立刻放开,
//此目的在于争取IC在上电的时候有控制权,使在未进入禁用JTAG或SW生效的时候取可控制IC进行烧录

#include "stm32f10x.h"
#include "LCD.h"
//#include "USART.h"
#include "eval.h"
#include "SysTickDelay.h"
#include "UART_INTERFACE.h"
#include <stdio.h>

unsigned int led0pwmval;
void adc_init_fun(void);

/* Private typedef -----------------------------------------------------------*/
typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
/* Private macro -------------------------------------------------------------*/
#define countof(a)   (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);




void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Configure USART1 Tx (PA.09) as alternate function push-pull */
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//GPIO_Init(GPIOA, &GPIO_InitStructure);#ifdef USE_STM3210C_EVAL

/* Initialize LEDs and Key Button mounted on STM3210X-EVAL board */       
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//PA0/1/2/3 作为模拟通道输入引脚                         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//系统中断管理
void NVIC_Configuration(void)

//NVIC_InitTypeDef NVIC_InitStructure;

/* Configure the NVIC Preemption Priority Bits */  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置优先级分组:先占优先级0位,从优先级4位

//设置向量表的位置和偏移
#ifdef  VECT_TAB_RAM  
/* Set the Vector Table base location at 0x20000000 */ 
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //向量表位于RAM
#else  /* VECT_TAB_FLASH  */
/* Set the Vector Table base location at 0x08000000 */ 
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //向量表位于FLASH
#endif
}

//配置系统时钟,使能各外设时钟
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA 
|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
|RCC_APB2Periph_ADC1  | RCC_APB2Periph_AFIO 
|RCC_APB2Periph_SPI1, ENABLE );
    
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 
// |RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2                           
// , ENABLE );  
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );  //使能ADC1通道时钟
/* Configure ADCCLK such as ADCCLK = PCLK2/6 */ 
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
}



void TIM3_Configuration(void)
{
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

//不分频。PWM频率=72000000/900=80Khz
/* ---------------------------------------------------------------
TIM3CLK 即PCLK1=36MHz
TIM3 Configuration: generate 1 PWM signals :
    TIM3CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
    TIM3 ARR Register = 900 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
    TIM3 Frequency = 36 KHz.
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 
TIM3CLK = 36 MHz, Prescaler = 0, TIM3 counter clock = 36MHz
--------------------------------------------------------------- */
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 499; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =0; //设置用来作为TIMx时钟频率除数的预分频值  不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

/* Output Compare Active Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIMx在CCR2上的预装载寄存器

TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器

/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
}



//配置所有外设
void Init_All_Periph(void)
{

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

//USART1_Configuration();
//USART_Configuration(9600);
    TIM3_Configuration();

LCD_Init();  
}









void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}

/**
  * @brief  Inserts a delay time.
  * @param  nTime: specifies the delay time length, in milliseconds.
  * @retval None
  */
//void Delay(__IO uint32_t nCount)
// {
// for(; nCount != 0; nCount--);
// }


//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
//设置转换序列    
//ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
//ADC1->SQR3|=ch;
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期      
//ADC1->CR2|=1<<22;       //启动规则转换通道 
/* Start ADC1 Software Conversion */ 
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
//while(!(ADC1->SR&1<<1));//等待转换结束  
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}

int main(void)
{
u16 adcx;
float temp;
Init_All_Periph();
SysTick_Initaize();

adc_init_fun();
//    
   STM_EVAL_PBInit(Button_KEY0, Mode_EXTI); //设置按键外部中断方式
STM_EVAL_PBInit(Button_KEY1, Mode_EXTI); //设置按键外部中断方式
STM_EVAL_PBInit(Button_WAKEUP, Mode_EXTI);
   TIM_SetCompare2(TIM3,led0pwmval);
   
   

POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(30,130,"ADC_CH0_Val:");      
LCD_ShowString(30,150,"ADC_CH0_Val:0.000V");  
STM_EVAL_LEDOff(LED1); //熄灭LED0
  STM_EVAL_LEDOff(LED2); //熄灭LED0   
while(1)
{
adcx=Get_Adc(ADC_Channel_1);
LCD_ShowNum(136,130,adcx,4,16);//显示ADC的值
temp=(float)adcx*(3.3/4096);
adcx=temp;                                                  //此处是怎么分开整数与小数部分的?
LCD_ShowNum(126,150,adcx,1,16);//显示电压值整数部分
temp-=adcx;
temp*=1000;
LCD_ShowNum(142,150,temp,3,16);//显示电压值小数部分

delay_ms(250);
      LCD_ShowString(30,170,"Current_Val:        mA");  
      LCD_ShowString(30,190,"Illumination_Val:      lux");  
}

}





#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif




//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
//方法一:
// delay_ms(10);//消抖
// if (STM_EVAL_PBGetState(Button_WAKEUP) == 0x01) //按键按下:高电平有效
// {
// STM_EVAL_LEDToggle(LED1);
// STM_EVAL_LEDToggle(LED2);
// }  
// //EXTI->R=1<<0;  //清除LINE0上的中断标志位  
// /* Clear the Key Button EXTI line pending bit */  
// EXTI_ClearITPendingBit(WAKEUP_BUTTON_EXTI_LINE);  //清除EXTI0线路挂起位

//方法二:
if(EXTI_GetITStatus(WAKEUP_BUTTON_EXTI_LINE) != RESET)  //检查指定的EXTI0线路触发请求发生与否
{
/* Clear the Key Button EXTI line pending bit */  
EXTI_ClearITPendingBit(WAKEUP_BUTTON_EXTI_LINE);  //清除EXTI0线路挂起位
/* Toggle LED1/2 */
STM_EVAL_LEDToggle(LED1);
STM_EVAL_LEDToggle(LED2);
}
}

//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
delay_ms(10);    //消抖  
if (STM_EVAL_PBGetState(Button_KEY0) == 0x00) //按键按下:低电平有效
{
led0pwmval=led0pwmval+15;if(led0pwmval>=210){}TIM_SetCompare2(TIM3,led0pwmval);
}
else if (STM_EVAL_PBGetState(Button_KEY1) == 0x00) //按键按下:低电平有效
{
led0pwmval=led0pwmval-15; if(led0pwmval==0){led0pwmval=15;}TIM_SetCompare2(TIM3,led0pwmval);
}
//EXTI->R=1<<13;     //清除LINE13上的中断标志位  
//EXTI->R=1<<15;     //清除LINE15上的中断标志位  
/* Clear the Key Button EXTI line pending bit */  
EXTI_ClearITPendingBit(BUTTON0_EXTI_LINE);  //清除EXTI13线路挂起位
EXTI_ClearITPendingBit(BUTTON1_EXTI_LINE);  //清除EXTI15线路挂起位
}

void adc_init_fun(void)
   {
    ADC_InitTypeDef ADC_InitStructure;  
      /* Resets ADC1 */ 
ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值

/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

/* ADC1 regular channel10 configuration */ 
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
//ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期
//ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道2,规则采样顺序值为2,采样时间为239.5周期
//ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 3, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道1,规则采样顺序值为3,采样时间为239.5周期
//ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 4, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道0,规则采样顺序值为4,采样时间为239.5周期

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1


/* Enable ADC1 reset calibaration register */   
ADC_ResetCalibration(ADC1); //重置指定的ADC1的校准寄存器
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待

/* Start ADC1 Software Conversion */ 
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
   }


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-4 23:25:44 | 显示全部楼层
你仿真看看,然后执行过这些初始化之后,看看液晶相关IO的寄存器状态.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-6 15:43:35 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
液晶的gpio用的应该只是GPIOB  GPIOC吧?我j_link仿真试试吧,我搞了一下,现在可以pwm输出了,不过我在家按键中断进来,还是一样的问题,所以。。我试试看吧
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-6-10 19:34:37 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
说了你肯定不会相信,程序我下载到板子里,液晶的白屏的,但偶尔会正常工作,但是就算正常工作了,断电重开,液晶99%还是白屏,最后我居然发现,把j—link的线插上,仅仅是线插上,程序就好用了。按理来说,j-link的线,仅仅相当于把引脚外接了互相绝缘的导线吧? 唉。。。把老师,师哥全都搞蒙了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-10 22:45:30 | 显示全部楼层
回复【4楼】萧城流云:
---------------------------------
是Mini板?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-22
在线时间
0 小时
 楼主| 发表于 2014-7-22 17:18:42 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
对的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-23 00:16:51 | 显示全部楼层
回复【6楼】萧城流云:
---------------------------------
你的液晶和开发板是一起买的吗?是不是代码比较老了?
从论坛下载下最新代码试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-4-13
在线时间
0 小时
发表于 2015-8-13 11:03:11 | 显示全部楼层
不要用LCD就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-23 12:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表