新手上路
积分 46
金钱 46
注册时间 2014-4-22
在线时间 0 小时
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(使用微库)
//LED0 A8
//LED1 D2
//用杜邦线把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的软件转换启动功能
}
我来回答