打印
[STM32F4]

f446GPIO 问题 求助

[复制链接]
908|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wejoncy|  楼主 | 2015-10-9 08:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我本来想用446来驱动tft
参考了,很多大神的代码,始终没反应

然后试着用示波器去看引脚波形,发现,GPIOB GPIOc 总共32个脚,只有4个脚可以收控制,其他的脚都不收控制

我也看了原理图和另一位大神驱动tft的引脚,注意事项,始终只有4个左右的脚手控制,其他没反应,输出都是0

不知道为什么
沙发
sky.sun.zz| | 2015-10-9 10:26 | 只看该作者
GPIOA/GPIOB/GPIOC的多条引脚都可以控制呀。怎么会只剩下4个脚可用呢?
https://bbs.21ic.com/icview-1132216-1-1.html,帖子成功在446开发板上使用TFT显示JPEG图片。

使用特权

评论回复
板凳
wejoncy|  楼主 | 2015-10-9 11:18 | 只看该作者
sky.sun.zz 发表于 2015-10-9 10:26
GPIOA/GPIOB/GPIOC的多条引脚都可以控制呀。怎么会只剩下4个脚可用呢?
https://bbs.21ic.com/icview-113221 ...

我看了你的帖子,好像是可以。原先我还以为屏坏了,然后换了另一块板子,是可以点亮的

换过来还是不行,之后我怀疑是引脚的问题,(跟你设置的一样),我用示波器来看输出,果然一直是0,没有任何变化,那我想是不是设置的问题,但是又有几个脚是可以的,我初始化的时候,分别做了两种尝试,

第一种 把所有脚都配置

第二种,为了防止其他脚的干扰,只配置需要的引脚,但是都没有用

使用特权

评论回复
地板
sky.sun.zz| | 2015-10-9 11:56 | 只看该作者
未见到你的初始化代码。

使用特权

评论回复
5
mmuuss586| | 2015-10-9 12:25 | 只看该作者
用示波器对比下时序呗;

使用特权

评论回复
6
wejoncy|  楼主 | 2015-10-9 13:59 | 只看该作者
本帖最后由 wejoncy 于 2015-10-9 14:01 编辑
sky.sun.zz 发表于 2015-10-9 11:56
未见到你的初始化代码。

#define        LCD_CS_SET  GPIOB->BSRR=GPIO_PIN_10    //Ƭѡ¶Ë¿Ú
#define        LCD_RS_SET        GPIOB->BSRR=GPIO_PIN_1    //Êý¾Ý/ÃüÁî
#define        LCD_WR_SET        GPIOB->BSRR=GPIO_PIN_15    //дÊý¾Ý
#define        LCD_RD_SET        GPIOB->BSRR=GPIO_PIN_3    //¶ÁÊý¾Ý
                                                           
#define        LCD_CS_CLR  GPIOB->BSRR=GPIO_PIN_10<<16     //Ƭѡ¶Ë¿Ú
#define        LCD_RS_CLR        GPIOB->BSRR=GPIO_PIN_1<<16     //Êý¾Ý/ÃüÁî
#define        LCD_WR_CLR        GPIOB->BSRR=GPIO_PIN_15<<16     //дÊý¾Ý
#define        LCD_RD_CLR        GPIOB->BSRR=GPIO_PIN_3<<16     //¶ÁÊý¾Ý

#define DATAOUT(dat) {GPIOC->ODR &=0XE000; GPIOC->ODR |= dat&0X1FFF; GPIOB->ODR &=0XFF8F; GPIOB->ODR |= (dat>>9)&0X0070;}


GPIO_InitTypeDef GPIO_InitStruct;
        __HAL_RCC_GPIOC_CLK_ENABLE();
        
        GPIO_InitStruct.Pin =  GPIO_PIN_All;//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_8|GPIO_PIN_9|GPIO_PIN_10|\
        GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_11;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

        __HAL_RCC_GPIOB_CLK_ENABLE();
        
        GPIO_InitStruct.Pin = GPIO_PIN_All;//GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|\
                                                        GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_10|GPIO_PIN_15;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        
        
        while(1)
        {
                DATAOUT(0xff);
                LCD_CS_CLR;
                LCD_RS_CLR;
                LCD_WR_CLR;
                LCD_RD_CLR;
               
                HAL_Delay(1000);
                DATAOUT(0);
                LCD_CS_SET;
                LCD_RS_SET;
                LCD_WR_SET;
          LCD_RD_SET;
                HAL_Delay(1000);
                }

这个就是我的io口测试代码了

使用特权

评论回复
7
wejoncy|  楼主 | 2015-10-9 14:02 | 只看该作者
mmuuss586 发表于 2015-10-9 12:25
用示波器对比下时序呗;

可是我现在连io口都不能控制,全部都是0,哪有时序信息:'(

使用特权

评论回复
8
sky.sun.zz| | 2015-10-9 14:44 | 只看该作者
本帖最后由 sky.sun.zz 于 2015-10-9 14:51 编辑

楼主:你对GPIOx的置位或置零好像有问题:
官方的语法:
假设对GPIOC-7操作:
#define LED3_ON        GPIOC->BRR = GPIO_Pin_7
#define LED3_OFF        GPIOC->BSRR = GPIO_Pin_7
或者可以:
GPIOC->ODR &=~0X0080
GPIOC->ODR  |=0X0080
或者还有:
GPIO_ResetBits(GPIOC, GPIO_Pin_7)
GPIO_SetBits(GPIOC, GPIO_Pin_7)
这些都是拿来就用的,为何你不用?

而你对GPIOC-10的的操作
LCD_CS_SET  GPIOB->BSRR=GPIO_PIN_10  
LCD_CS_CLR  GPIOB->BSRR=GPIO_PIN_10<<16
你右移16位不是把GPIOC 都清空了吗(假设D0位是0)
BRR和BSRR有所区别呀!!




使用特权

评论回复
9
wejoncy|  楼主 | 2015-10-9 14:54 | 只看该作者
sky.sun.zz 发表于 2015-10-9 14:44
楼主:你对GPIOx的置位或置零好像有问题:
官方的语法:
假设对GPIOC-7操作:
非常感谢您的回复
你好,我知道你说的这个,可是我看了f446的手册,只有一个寄存器,那就是bsrr,其实就是上面那两个寄存器的合体,两个16位变成一个32位

而且我这样操作板子上的led灯是可以的,也有部分的io口是可以这样操作的。

官方的库函数是这样
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;
  }
}

使用特权

评论回复
10
wejoncy|  楼主 | 2015-10-9 15:07 | 只看该作者
sky.sun.zz 发表于 2015-10-9 14:44
楼主:你对GPIOx的置位或置零好像有问题:
官方的语法:
假设对GPIOC-7操作:

我刚刚又试了一下GPIOB->ODR = 0xffff;
依旧是0

使用特权

评论回复
11
sky.sun.zz| | 2015-10-9 16:25 | 只看该作者
l楼主难道不能转弯一下,试试我的操作方法吗?
#define CS_L                        GPIOA->ODR  &= ~0x0040
#define CS_H                        GPIOA->ODR         |=         0X0040
#define RS_L                        GPIOA->ODR         &= ~0X0080
#define RS_H                        GPIOA->ODR         |=         0X0080
#define WR_L                        GPIOA->ODR         &= ~0X0100
#define WR_H                        GPIOA->ODR         |=         0X0100
#define RD_L                        GPIOA->ODR         &= ~0X0200
#define RD_H                        GPIOA->ODR         |=         0X0200
#define RST_L                        GPIOA->ODR         &= ~0X0400
#define RST_H                        GPIOA->ODR         |=         0X0400

使用特权

评论回复
12
wejoncy|  楼主 | 2015-10-9 18:21 | 只看该作者
sky.sun.zz 发表于 2015-10-9 16:25
l楼主难道不能转弯一下,试试我的操作方法吗?
#define CS_L                        GPIOA->ODR  &= ~0x0040
#define CS_H                        GPI ...

我上面有试啊,全部置一,GPIOB->ODR = 0xFFFF  GPIOC->ODR = 0xFFFF 依旧,除了那几个可以控制的io口外都是0
控制io口的寄存器就这两种方法吧,我都有试啊

使用特权

评论回复
13
mintspring| | 2015-10-9 21:46 | 只看该作者
lou zhu shi yong  na ge cubeMX pei zhi shi shi kan

使用特权

评论回复
14
皈依| | 2015-10-10 08:28 | 只看该作者
感觉应该是配置问题

使用特权

评论回复
15
wejoncy|  楼主 | 2015-10-10 09:01 | 只看该作者
mintspring 发表于 2015-10-9 21:46
lou zhu shi yong  na ge cubeMX pei zhi shi shi kan

多谢回复,我用的固件库里面的例程,应该是没有问题的,不过我试试
谢谢

使用特权

评论回复
16
wejoncy|  楼主 | 2015-10-10 09:12 | 只看该作者
sky.sun.zz 发表于 2015-10-9 16:25
l楼主难道不能转弯一下,试试我的操作方法吗?
#define CS_L                        GPIOA->ODR  &= ~0x0040
#define CS_H                        GPI ...

LCD.zip (1.65 MB)

主要gpio配置在lcd_init();里面

也就是文件  lcd_i9341.c  第226行
多谢了

使用特权

评论回复
17
sky.sun.zz| | 2015-10-10 11:44 | 只看该作者
本帖最后由 sky.sun.zz 于 2015-10-10 15:09 编辑
wejoncy 发表于 2015-10-10 09:12
主要gpio配置在lcd_init();里面

也就是文件  lcd_i9341.c  第226行

楼主,修改了GPIO口操作定义,是可以控制GPIO:
#ifndef __LCD_H
#define __LCD_H                           
#include "stm32f446xx.h"
#include "font.h"
#include <stdbool.h>
#define        LCD_HEIGHT        240
#define        LCD_WIDTH        320

#define        ENZERO        1
#define        DISZERO        0

#define USEWALLPAPER        0
#define USEBACKCOLOR        1
#define        DONOTCARE                0
void _delayus(unsigned int n);

#define        LCD_RST        {GPIOB->ODR &=~0X0010;=GPIO_PIN_8;_delayus(7);GPIOB->ODR |=0X0010;_delayus(7);GPIOB->BSRR=GPIO_PIN_8;}
#define        LCD_CS_CLR  GPIOB->ODR &=~0x0400  
#define        LCD_CS_SET  GPIOB->ODR |=0x0400        
#define        LCD_RS_CLR        GPIOB->ODR &=~0x0001
#define        LCD_RS_SET        GPIOB->ODR |=0X0001        
#define        LCD_WR_CLR        GPIOB->ODR &=~0X8000        
#define        LCD_WR_SET        GPIOB->ODR |=0X8000               
#define        LCD_RD_CLR        GPIOB->ODR &=~0X0008        
#define        LCD_RD_SET        GPIOB->ODR |=0X0008                
#define DATAOUT(dat) {GPIOC->ODR &=0XE000; GPIOC->ODR |= dat&0X1FFF; GPIOB->ODR &=0XFF8F; GPIOB->ODR |= (dat>>9)&0X0070;}

void LCD_SetColors(uint16_t TextColor, uint16_t BackColor);
void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor);
void LCD_SetTextColor(uint16_t Color);
void LCD_SetBackColor(uint16_t Color);
void LCD_SetFont(sFONT *fonts);
sFONT *LCD_GetFont(void);


void        LCD_Init(void);
void    LCD_Clear(uint16_t        color);
void        LCD_Fill_Color(uint16_t i0, uint16_t j0, uint16_t width, uint16_t height, uint16_t color);
void        LCD_SetPixel(uint16_t x,uint16_t y,uint16_t color);
void        LCD_DrawLine(uint16_t Xstart,uint16_t Ystart,uint16_t Xend,uint16_t Yend,uint16_t color);
void        LCD_DrawRect(uint16_t i0, uint16_t j0, uint16_t i1, uint16_t j1, uint16_t color);
void        LCD_DrawCircle(uint16_t i_start, uint16_t j_start, uint16_t radius,uint16_t color);

void        LCD_ShowBMP(uint16_t        X0,uint16_t        Y0,uint16_t        width,uint16_t        height,const uint16_t *BMP);
void        LCD_ShowBMP3(uint16_t X0,uint16_t        Y0,uint16_t        width,uint16_t        height,const uint16_t *BMP);

void        WriteNum(uint16_t x,uint16_t y,uint32_t num0,uint8_t len,uint8_t enzero,sFONT *fonts,uint16_t TextColor,uint16_t BackColor,uint8_t useWhichBGColor);
uint8_t WriteOneASCII(uint16_t x0,uint16_t y0,uint8_t pucMsk,sFONT *fonts,uint16_t TextColor,uint16_t BackColor,uint8_t useWhichBGColor);
void WriteString(uint16_t x0, uint16_t y0,uint8_t *pcStr,sFONT *fonts,uint16_t TextColor,uint16_t BackColor,uint8_t useWhichBGColor);

void        LCD_Show**(uint16_t        x,uint16_t        y);
void        LCD_ShowBatBmp(uint16_t        x,uint16_t        y);

void        LCD_SetWallpaper(uint8_t        wpindex);

void        LCD_ShowIcon(uint16_t        x,uint16_t        y,uint8_t icindex,uint8_t sel);



//»­±ÊÑÕÉ«yeqinggui 20130410
#define WHITE                  0xFFFF
#define BLACK                  0x0000         
#define BLUE                  0x001F  
#define BRED             0XF81F
#define GRED                          0XFFE0
#define GBLUE                         0X07FF
#define RED                    0xF800
#define MAGENTA                0xF81F
#define GREEN                  0x07E0
#define CYAN                   0x7FFF
#define YELLOW                 0xFFE0
#define BROWN                          0XBC40 //×ØÉ«
#define BRRED                          0XFC07 //×غìÉ«
#define GRAY                           0X8430 //»ÒÉ«
//GUIÑÕÉ«

#define DARKBLUE               0X01CF        //ÉîÀ¶É«
#define LIGHTBLUE               0X7D7C        //dzÀ¶É«  
#define GRAYBLUE                0X5458 //»ÒÀ¶É«
//ÒÔÉÏÈýɫΪPANELµÄÑÕÉ«

#define LIGHTGREEN              0X841F //dzÂÌÉ«
//#define LIGHTGRAY        0XEF5B //dz»ÒÉ«(PANNEL)
#define LGRAY                          0XC618 //dz»ÒÉ«(PANNEL),´°Ìå±³¾°É«

#define LGRAYBLUE        0XA651 //dz»ÒÀ¶É«(Öмä²ãÑÕÉ«)
#define LBBLUE           0X2B12 //dz×ØÀ¶É«(Ñ¡ÔñÌõÄ¿µÄ·´É«)



//LCD_RD_SET;
#define LCD_WR_REG(data){\
LCD_CS_CLR;\
LCD_RS_CLR;\
LCD_WR_CLR;\
DATAOUT(data);\
_delayus(5);\
LCD_WR_SET;\
_delayus(5);\
LCD_CS_SET;\
}




//LCD_RD_SET;

#define LCD_WR_DATA(data){\
LCD_CS_CLR;\
LCD_WR_CLR;\
LCD_RS_SET;\
DATAOUT(data);\
        _delayus(5);\
LCD_WR_SET;\
        _delayus(5);\
LCD_CS_SET;\
}
#define LCD_WR_ONEDOT(color){\
LCD_CS_CLR;\
LCD_RD_SET;\
LCD_RS_SET;\
DATAOUT(color);\
LCD_WR_CLR;\
LCD_WR_SET;\
LCD_CS_SET;\
}
#endif

你的 LCD_WR_REG()编译有一个警告,应该纠正,否则写的数据可能有误。

LCD.rar (4.3 MB)

如果仍然无法解决,应该检查一下硬件了。

使用特权

评论回复
18
wejoncy|  楼主 | 2015-10-10 17:12 | 只看该作者
sky.sun.zz 发表于 2015-10-9 10:26
GPIOA/GPIOB/GPIOC的多条引脚都可以控制呀。怎么会只剩下4个脚可用呢?
https://bbs.21ic.com/icview-113221 ...

非常感谢,可以了。:victory:

使用特权

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

本版积分规则

15

主题

168

帖子

3

粉丝