找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1120|回复: 2
收起左侧

STM32程序想把PA0改到PC10,PB1改到PC3 直接改可以吗?

[复制链接]
ID:692206 发表于 2022-3-7 19:51 | 显示全部楼层 |阅读模式
硬件为gp2y1014au0f这个pm2.5检测模块和STM32F103RCT6连接,硬件连接图如图所示;
20210418150214914.png
现在因为PA0,PB1两个IO口被占用,想把PA0改到PC10,PB1改到PC3,请问直接改是不是有影响,或者把PA0改到PA2也行,只能重定义吗?希望大佬给出解决方案和代码。

gp2y1014au0f.c代码如下:
  1. #include "gp2y1014au0f.h"
  2. #include "delay.h"

  3. /*初始化ADC*/
  4. void  Adc_Init(void)
  5. {         
  6.         ADC_InitTypeDef ADC_InitStructure;
  7.         GPIO_InitTypeDef GPIO_InitStructure;

  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


  9.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  10.         //PA1 作为模拟通道输入引脚                        
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);        
  14.   
  15.         //PB1 作为脉冲输出引脚   
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                        
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  20.         GP2Y_High;

  21.         ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

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

  29.   
  30.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  31.         
  32.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  33.          
  34.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  35.         
  36.         ADC_StartCalibration(ADC1);         //开启AD校准

  37.         while(ADC_GetCalibrationStatus(ADC1));                 //等待校准结束

  38.         //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的软件转换启动功能
  39. }                                 
  40. //获得ADC值
  41. //ch:通道值 0~3
  42. u16 Get_Adc(u8 ch)   
  43. {
  44.           //设置指定ADC的规则组通道,一个序列,采样时间
  45.         ADC_RegularChannelConfig(ADC1, ch, 0, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      
  46.   
  47.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能        
  48.          
  49.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

  50.         return ADC_GetConversionValue(ADC1);                //返回最近一次ADC1规则组的转换结果
  51. }

  52. float GetGP2Y(void)
  53. {
  54.     u32 AD_PM;  
  55.           double pm;
  56.     GP2Y_Low;
  57.     delay_us(280);
  58.     AD_PM = Get_Adc(ADC_Channel_0);        //PA0
  59.     delay_us(40);
  60.     GP2Y_High;
  61.     delay_us(9680);
  62.     pm = 0.17*AD_PM-0.1; //转换公式
  63.     //printf("%f\n",pm);
  64.         return pm;
  65. }

  66. u16 Get_GP2Y_Average(u8 times)
  67. {
  68.         u32 pm_val=0;
  69.         u8 t;
  70.         for(t=0;t<times;t++)
  71.         {
  72.                 pm_val+=GetGP2Y();
  73.                 delay_ms(5);
  74.         }
  75.         return pm_val/times;
  76. }

复制代码
gp2y1014au0f.h代码如下:
  1. #ifndef __GP2Y1014AU0F_H
  2. #define __GP2Y1014AU0F_H        
  3. #include "sys.h"

  4. #define GP2Y_High GPIO_SetBits(GPIOB,GPIO_Pin_1);
  5. #define GP2Y_Low  GPIO_ResetBits(GPIOB,GPIO_Pin_1);

  6. float GetGP2Y(void);
  7. void Adc_Init(void);
  8. u16  Get_Adc(u8 ch);
  9. u16 Get_GP2Y_Average(u8 times);

  10. #endif

复制代码

回复

使用道具 举报

ID:123289 发表于 2022-3-8 15:07 | 显示全部楼层
写程序时,尽量不要将端口符号直接写入程序中,如:PA0 = 0
而要先定义一个符号来替代端口号:如,定义:XLED3 = PA0。
如此,在程序中将 PA0 = 0 改写成 XLED3 = 0,就可以了。
这样做的好处是:当你将LED3改接到 PC5之后,程序只要改动一个地方,
那就是 XLED3 = PA0,改成 XLED3 = PC5,程序中所有地方都不要动。
回复

使用道具 举报

ID:692206 发表于 2022-3-8 15:41 | 显示全部楼层
yzwzfyz 发表于 2022-3-8 15:07
写程序时,尽量不要将端口符号直接写入程序中,如:PA0 = 0
而要先定义一个符号来替代端口号:如,定义:X ...

这个我知道大佬,现在的问题就是因为PA1有特殊的复用功能,直接改端口貌似不行,我想问下是不是可以直接改成别的端口。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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