我正在尝试将照片上设备的输出信号发送到STM32F100rbt6b。我把盖革计数器上的UIN引脚连接到STM32F100rbt6b上的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);
}

发布于 2019-02-25 06:56:34
您已将PA10引脚初始化为模拟输入。如果您想使用带LCD屏幕的模拟输入,则需要在此引脚上设置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作为具有模数转换器的模拟输入,不幸的是,这是不可能的,根据STM32F100x6数据表的Table 4. Low & medium-density STM32F100xx pin definitions部分,模数转换器未作为此引脚的备用功能之一列出:

https://stackoverflow.com/questions/54857092
复制相似问题