OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2935|回复: 8

PA2脚输入方波,想在PA1脚输出反向的方波,PA2状态监测不对..

[复制链接]

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
发表于 2016-6-6 08:59:36 | 显示全部楼层 |阅读模式
3金钱
感觉挺简单的,可就是在PA1脚输出不了波形。
单独控制PA1脚有定时器控制反转,没问题。
应该能排除硬件故障的问题。
想不出原因在哪?求助,自个看不出问题来...#include "stm32f10x.h"
[mw_shl_code=applescript,true]#include "stm32f10x.h"
#include "gpio.h"

int main(void)
{
        GPIO_Config();
        while(1)
        {
                if(PA2() == 1)
                        PA1(1);
                else
                        PA1(0);
        }
}[/mw_shl_code]
[mw_shl_code=applescript,true]#include "gpio.h"

void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}
[/mw_shl_code]
[mw_shl_code=applescript,true]#ifndef __GPIO_H_
#define __GPIO_H_

#include "stm32f10x.h"

#define PA0(a)          if(a)\
                                                        GPIO_SetBits(GPIOA, GPIO_Pin_0);\
                                                else\
                                                        GPIO_ResetBits(GPIOA, GPIO_Pin_0)

#define PA1(a)          if(a)\
                                                        GPIO_SetBits(GPIOA, GPIO_Pin_1);\
                                                else\
                                                        GPIO_ResetBits(GPIOA, GPIO_Pin_1)

#define PC7(a)          if(a)\
                                                        GPIO_SetBits(GPIOC, GPIO_Pin_7);\
                                                else\
                                                        GPIO_ResetBits(GPIOC, GPIO_Pin_7)

#define PA2()                GPIO_ReadInputDataBit(GPIOA, 2)

#define PC6()                GPIO_ReadInputDataBit(GPIOC, 6)

void GPIO_Config(void);
        
#endif
[/mw_shl_code]
PA2-PA1.zip (1.09 MB, 下载次数: 225)

最佳答案

查看完整内容[请看2#楼]

#define PA2() GPIO_ReadInputDataBit(GPIOA, 2) 主句话错了,应该是: #define PA2() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2016-6-6 08:59:37 | 显示全部楼层
#define PA2()                GPIO_ReadInputDataBit(GPIOA, 2)
主句话错了,应该是:
#define PA2()                GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)
回复

使用道具 举报

10

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
837
金钱
837
注册时间
2016-5-13
在线时间
182 小时
发表于 2016-6-6 09:04:42 | 显示全部楼层
试试PA1=~PA2;
相信自己,每一步都是在进步
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2016-6-6 09:23:37 | 显示全部楼层
试了,这么试的。while(1){PA2((PA1())},按说PA2应该和PA1波形一致,结果PA2一直是低电平。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-6-6 09:33:12 | 显示全部楼层
你应该在读引脚的同时跟上一次状态相比较,如果相同则不变,如果相反才改变。另外这部分用定时器更好一点,带有滤波电路,防止输入方波有毛刺误触发,同时还可以避免CPU浪费
回复

使用道具 举报

10

主题

92

帖子

0

精华

高级会员

Rank: 4

积分
837
金钱
837
注册时间
2016-5-13
在线时间
182 小时
发表于 2016-6-6 09:41:39 | 显示全部楼层
while(1){PA2((PA1())}???
你这样不是把PA1的值给PA2吗?
调转了吧
相信自己,每一步都是在进步
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2016-6-6 10:01:09 | 显示全部楼层
Jower 发表于 2016-6-6 09:41
while(1){PA2((PA1())}???
你这样不是把PA1的值给PA2吗?
调转了吧

写错了,抱歉。
实际写的是PA1(PA2());
试了,不行的。
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2016-6-6 10:10:58 | 显示全部楼层
[mw_shl_code=applescript,true]int main(void)
{
        GPIO_Config();
        while(1)
        {
//                PA1((PA2());               
                if(PA2() == 1)
                {
                        if(GPIO_ReadInputDataBit(GPIOA, 1) == 0)
                                PA1(1);
                }
                else
                {
                        if(GPIO_ReadInputDataBit(GPIOA, 1) == 1)
                                PA1(0);
                }
        }
}[/mw_shl_code]

试了,仍不行,PA1始终是低电平。
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2016-6-6 10:53:04 | 显示全部楼层
用定时器产生1秒中断,中断里加上:GPIOA->ODR ^= GPIO_Pin_1A1可观测到2s的方波。
硬件应该没问题。还是我理解的不对,程序写的有问题。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 00:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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