打印

高手帮忙看下GPIO配置子程序,有点疑问!?

[复制链接]
2668|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wgsxsm|  楼主 | 2012-6-26 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wgsxsm 于 2012-6-27 22:26 编辑

网络搜的一开源的模拟示波器程序,对GPIO的配置如下,请问红色部分对吗?看库函数说明和资料,怎么感觉没有这么写的呢、?谢谢

void GPIO_configure(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
  

    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
沙发
lyncxy119| | 2012-6-26 22:37 | 只看该作者
这个是对GPIO时钟的配置,一般这两句是写在RCC时钟的配置里面的,用来使能GPIO的时钟

使用特权

评论回复
板凳
wgsxsm|  楼主 | 2012-6-26 23:44 | 只看该作者
谢谢二楼,
不过我感觉前面的两句是对GPIO的时钟配置
红色的两句我还第一次看到
麻烦有见过的高手给予详细讲解一下,谢谢

使用特权

评论回复
地板
zh5202| | 2012-6-27 08:52 | 只看该作者
前面两句是对GPIOA和GPIOB端口的时钟使能,后面红色的两句确实没有看到过。
更重要的是在STM32F10X芯片手册上的系统总线架构图上面发现:
GPIO口是挂在APB2总线上的,并非挂在AHB总线上的,所以我怀疑红色部分语句是否有错?
楼主的程序来源哪里?

使用特权

评论回复
5
wgsxsm|  楼主 | 2012-6-27 22:26 | 只看该作者
前面两句是对GPIOA和GPIOB端口的时钟使能,后面红色的两句确实没有看到过。
更重要的是在STM32F10X芯片手册上的系统总线架构图上面发现:
GPIO口是挂在APB2总线上的,并非挂在AHB总线上的,所以我怀疑红色部分语句是 ...
zh5202 发表于 2012-6-27 08:52


来源于网络一开源的一个虚拟示波器程序,仪星电子科技开源的
如果你需要源程序,可以发给你

使用特权

评论回复
6
xujj1985| | 2012-6-28 11:57 | 只看该作者
本帖最后由 xujj1985 于 2012-6-28 11:58 编辑
前面两句是对GPIOA和GPIOB端口的时钟使能,后面红色的两句确实没有看到过。
更重要的是在STM32F10X芯片手册上的系统总线架构图上面发现:
GPIO口是挂在APB2总线上的,并非挂在AHB总线上的,所以我怀疑红色部分语句是 ...
zh5202 发表于 2012-6-27 08:52

并没有见过这样的设置,是否正确有待考证

使用特权

评论回复
7
wgsxsm|  楼主 | 2012-6-28 13:19 | 只看该作者
int main(void)
{  
        vu8 s;
        /*设置系统时钟*/
        Set_System();
       
        /*初始化USB模块*/  
        Set_USBClock();
        USB_Interrupts_Config();
        USB_Init();
        /*初始化AD模块*/
        m_adc_clk_config();
        m_adc_gpio_config();
        m_adc_Interrupts_Config();
        m_adc_init();

        /*初始化GPIO引脚作为放大控制引脚*/
        GPIO_configure();
                                          
  count_in=0;
        /*默认初始值为放大1倍*/

//         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
//         GPIO_ResetBits(GPIOA,GPIO_Pin_2);

        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
        GPIO_ResetBits(GPIOB,GPIO_Pin_13);
        GPIO_ResetBits(GPIOB,GPIO_Pin_14);

          while (1)
          {                 
          }
}

使用特权

评论回复
8
wgsxsm|  楼主 | 2012-6-28 13:21 | 只看该作者
本帖最后由 wgsxsm 于 2012-6-28 13:26 编辑

void GPIO_configure(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);

                RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
                RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);       
                RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);                

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);


//                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
//                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//                 GPIO_Init(GPIOA, &GPIO_InitStructure);
}

使用特权

评论回复
9
wgsxsm|  楼主 | 2012-6-28 13:21 | 只看该作者
void Set_System(void)
{
  ErrorStatus HSEStartUpStatus;
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

#ifdef STM32F10X_CL
    /* Configure PLLs *********************************************************/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
    RCC_PLL2Config(RCC_PLL2Mul_8);

    /* Enable PLL2 */
    RCC_PLL2Cmd(ENABLE);

    /* Wait till PLL2 is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
    {}

    /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
#else
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
#endif

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock configuration.
       User can add here some code to deal with this error */   

    /* Go to infinite loop */
    while (1)
    {
    }
  }
}

使用特权

评论回复
10
wgsxsm|  楼主 | 2012-6-28 13:22 | 只看该作者
void m_adc_clk_config(void)
{
    /* ADCCLK = PCLK2/6 */
          RCC_ADCCLKConfig(RCC_PCLK2_Div6);
   
    /* Enable DMA1 clock */
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

          /* Enable ADC1 clock */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);       
}                                                                                                                  

void m_adc_gpio_config(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO , ENABLE);                        // | RCC_APB2Periph_AFIO

          /* Configure PA.03 PC.00 (ADC Channel 3、10) as analog input -------------------------*/
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
          GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
          GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void m_adc_init(void)
{
//         ADC_InitTypeDef ADC_InitStructure;
//         DMA_InitTypeDef DMA_InitStructure;
  
          /* DMA1 channel1 configuration ---------------------------------------------*/
          DMA_DeInit(DMA1_Channel1);
          DMA_InitStructure.DMA_PeripheralBaseAddr = (ADC1_DR_Address+1);
          DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize =16384;//1024;
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
          DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable;
          DMA_InitStructure.DMA_PeripheralDataSize =  DMA_PeripheralDataSize_Byte;          
          DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
          DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;          
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;
          DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
          DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
          /* Enable the DMA1 Channel1 Transfer complete interrupt */
          DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);

          /* Enable DMA1 channel1 */
          DMA_Cmd(DMA1_Channel1, ENABLE);

   
          /* ADC1 configuration ------------------------------------------------------*/
          ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
          ADC_InitStructure.ADC_ScanConvMode = ENABLE;
          ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;          //ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfChannel = 2;
          ADC_Init(ADC1, &ADC_InitStructure);

          /* ADC1 regular channel 8、9 configuration */
                ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);
          ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_1Cycles5);          //ADC_SampleTime_239Cycles5
  
//          ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_1Cycles5);

          /* Enable ADC1 DMA */
          ADC_DMACmd(ADC1, ENABLE);
  
          /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);

          /* Enable ADC1 reset calibaration register */   
          ADC_ResetCalibration(ADC1);
          /* Check the end of ADC1 reset calibration register */
          while(ADC_GetResetCalibrationStatus(ADC1));

          /* Start ADC1 calibaration */
          ADC_StartCalibration(ADC1);
          /* Check the end of ADC1 calibration */
          while(ADC_GetCalibrationStatus(ADC1));

                ADC_Cmd(ADC1, DISABLE);
}

void m_adc_Interrupts_Config(void)
{
          NVIC_InitTypeDef NVIC_InitStructure;
    /* Enable the DMA1 Channel1 Interrupt */
          NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
11
wgsxsm|  楼主 | 2012-6-28 13:24 | 只看该作者
既然有人感兴趣,我就把有关的程序发来,整个包太大了,没法发上来,关于一个虚拟示波器的
虽然编译有警告,但是下载之后可以当示波器用,这点非常佩服!

使用特权

评论回复
12
悠然科技| | 2012-6-28 16:03 | 只看该作者
我只举一个例子:关于RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
道理很简单,你跟踪一下看看,RCC_APB2Periph_GPIOA是什么,
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
也就是说,RCC_APB2Periph_GPIOA = ((uint32_t)0x00000004)是个常数而已。。。
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);等同于RCC_AHBPeriphClockCmd(0x04, ENABLE);
再查一下:#define RCC_AHBPeriph_SRAM               ((uint32_t)0x00000004)
等同于RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM, ENABLE);
平时用固件库的时候,可以时不时的进去看看函数源码,才能做到知其然也知其所以然。。。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wgsxsm + 1
13
wgsxsm|  楼主 | 2012-6-28 16:44 | 只看该作者
谢谢楼上达达

使用特权

评论回复
14
zh5202| | 2012-7-1 22:53 | 只看该作者
12楼很牛啊,要甩裤子哦

使用特权

评论回复
15
悠然科技| | 2012-7-2 13:46 | 只看该作者
过奖过奖。。
但是有裤子的话,一定要收下,哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

652

帖子

4

粉丝