代码之家  ›  专栏  ›  技术社区  ›  A191919

从盖革计数器接收输入

  •  1
  • A191919  · 技术社区  · 6 年前

    我正在尝试将照片上设备的输出信号发送到stm32f100rbt6b。 我在stm32f100rbt6b上将uin管脚从盖革计数器连接到pa10管脚,但似乎工作不正常,因为每次盖革计数器点击lcd显示屏时都不递增数字。我认为这与错误的pin10模式有关。哪个是对的?用 GPIO_Mode_IN_FLOATING 增量太快。

    #include "stm32f10x.h"
    #include "stm32f10x_rcc.h"
    #include "stm32f10x_gpio.h"
    
    #define LCD_PORT GPIOC
    #define LCD_RCC_GPIO RCC_AHB1Periph_GPIOC
    #define LCD_E_Pin GPIO_Pin_12
    #define LCD_RS_Pin GPIO_Pin_10
    
    void delay(unsigned int s);
    void lcd_init_gpio();
    void lcd_write_data(int data);
    void lcd_init();
    void lcd_write_str(char*str);
    void lcd_write_cmd(u16 cmd);
    void lcd_set_cursor(int line,int pos);
    void lcd_write_dec_xxx(uint16_t data);
    void lcd_write_dec_xxx(uint16_t data);
    void lcd_write_dec_xx(uint8_t data);
    void lcd_write_dec_x(uint8_t data);
    int counter = 0;
    
    int main(void)
    {
          lcd_init();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
            GPIO_InitTypeDef initInput;
            initInput.GPIO_Mode = GPIO_Mode_AIN;
            initInput.GPIO_Speed = GPIO_Speed_2MHz;
            initInput.GPIO_Pin = GPIO_Pin_10;
            GPIO_Init(GPIOA, &initInput);
          lcd_set_cursor(0,1);
    
        while(1){
    
                        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10))
                        {
                            counter=counter+1;
                            lcd_set_cursor(0,3);
                            lcd_write_dec_xxx(((uint8_t)counter));
                            delay(1000000);
                        }           
    
        }
    }
    
    void delay(unsigned int s){
        while(--s > 0) {
            __NOP();
        }
    }
    
    const uint8_t lcd_2x16_decode[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    
    void lcd_write_dec_xxxx(uint16_t data){
        lcd_write_data(lcd_2x16_decode[(data / 1000) & 0x0F]);
        lcd_write_data(lcd_2x16_decode[((data % 1000) / 100) & 0x0F]);
        lcd_write_data(lcd_2x16_decode[((data % 1000) % 100) / 10 & 0x0F]);
        lcd_write_data(lcd_2x16_decode[((data % 1000) % 100) % 10 & 0x0F]);
    }
    
    void lcd_write_dec_xxx(uint16_t data){
        lcd_write_data(lcd_2x16_decode[(data / 100) & 0x0F]);
        lcd_write_data(lcd_2x16_decode[((data % 100) / 10) & 0x0F]);
        lcd_write_data(lcd_2x16_decode[((data % 100) % 10) & 0x0F]);
    }
    
    void lcd_write_dec_xx(uint8_t data){
        lcd_write_data(lcd_2x16_decode[((data % 100) / 10) & 0x0F]);
        lcd_write_data(lcd_2x16_decode[((data % 100) % 10) & 0x0F]);
    }
    
    void lcd_write_dec_x(uint8_t data) {
        lcd_write_data(lcd_2x16_decode[data]);
    }
    void lcd_init_gpio() {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        GPIO_InitTypeDef init;
        init.GPIO_Mode = GPIO_Mode_Out_PP;
        init.GPIO_Speed=GPIO_Speed_50MHz;
        init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10  | GPIO_Pin_12;
        GPIO_Init(GPIOC, &init);
    }
    void lcd_write_data(int data) {
        GPIO_SetBits(LCD_PORT,data | LCD_E_Pin);
        delay(0xFFFF);
        GPIO_ResetBits(LCD_PORT,LCD_E_Pin | data);
    }
    void lcd_init() {
        lcd_init_gpio();
        int del = 99999;
        GPIO_ResetBits(LCD_PORT, LCD_RS_Pin);
        delay(del);
        lcd_write_data(0x30);
        delay(del);
        lcd_write_data(0x30);
        delay(del);
        lcd_write_data(0x30);
        delay(del);
        lcd_write_data(0x38);
        delay(del);
        lcd_write_data(0x0f);
        delay(del);
        lcd_write_data(0x01);
        delay(del);
        lcd_write_data(0x06);
        delay(del);
        lcd_write_data(0x02);
        delay(del);
        GPIO_SetBits(LCD_PORT,LCD_RS_Pin);
    }
    
    void lcd_write_str(char*str) {
        do {
            lcd_write_data(*str);
        }while(*++str);
    }
    void lcd_write_cmd(u16 cmd) {
        GPIO_ResetBits(LCD_PORT,LCD_RS_Pin);
        lcd_write_data(cmd);
        GPIO_SetBits(LCD_PORT,LCD_RS_Pin);
    }
    void lcd_set_cursor(int line,int pos) {
        pos |=0x80;
        if (line == 1) {
            pos += 0x40;
        }
        lcd_write_cmd(pos);
    }
    

    enter image description here

    0 回复  |  直到 6 年前
        1
  •  1
  •   Andy J    6 年前

    您已将PA10引脚初始化为模拟输入。如果你想使用带液晶屏的模拟输入,你需要在这个引脚上设置一个ADC。

    如果要将PA10管脚设置为普通的高/低数字输入,请执行以下操作:

    /* Setup PA10 input */
    void PA10_Config(void)
    {
      /* Local variables */
      GPIO_InitTypeDef   GPIO_InitStructure;
    
      /* Configure PA10 as input */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    

    但看看你的申请表,你可能不想这样。你最可能寻找的是带有ADC的模拟输入,它将该管脚上的模拟电压转换成你的微型计算机可以解释的数字。

    如果你想让pa10作为一个adc的模拟输入,不幸的是这是不可能的,根据 Table 4. Low & medium-density STM32F100xx pin definitions 在STM32F100X6数据表的一节中,ADC未列为该引脚的替代功能(AFS)之一:

    enter image description here