OpenEdv-开源电子网

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

开通UART,PA1和PA8作为普通IO口应该如何配置?

[复制链接]

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-11-17
在线时间
12 小时
发表于 2018-8-31 10:07:52 | 显示全部楼层 |阅读模式
1金钱
void uart2_init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //使能GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    //使能USART2时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);    //使能DMA传输

    USART_DeInit(USART2);  //复位串口2

    //485控制脚,低电平接收,高电平发送   PA1
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA.1
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA1
     GPIO_SetBits(GPIOA, GPIO_Pin_1);//就是这一行,PA1无法输出高电平,UART2的PA8也是一样,无法输出高电平
    PAout(1) = 0;


    //USART2_TX   PA2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2

    //USART2_RX      PA3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3

    //Usart2 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ; //抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

    //USART 初始化设置
    USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

    USART_Init(USART2, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启空闲中断
    USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); //使能串口2 DMA接收
    USART_Cmd(USART2, ENABLE);                    //使能串口
    Cmd.RxReq = 0;

    //USART2_RX相应的DMA配置
    DMA_DeInit(DMA1_Channel6);   //将DMA的通道6寄存器重设为缺省值  串口2_RX对应的是DMA通道6
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;  //DMA外设ADC基地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_U2_RxBuf;  //DMA内存基地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设读取发送到内存
    DMA_InitStructure.DMA_BufferSize = DMA_U2_RxLen;  //DMA通道的DMA缓存的大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
    DMA_Init(DMA1_Channel6, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART2_Rx_DMA_Channel所标识的寄存器

    DMA_Cmd(DMA1_Channel6, ENABLE);  //正式驱动DMA传输


最佳答案

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

简单的说,你直接用程序命令控制引脚就用 OUT_PP; 你用程序命令控制内部外设,外设再控制引脚就用AF_PP; 所以你要用OUT_PP。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2018-8-31 10:07:53 | 显示全部楼层
简单的说,你直接用程序命令控制引脚就用  OUT_PP;
你用程序命令控制内部外设,外设再控制引脚就用AF_PP;
所以你要用OUT_PP。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-31 10:10:18 | 显示全部楼层
用的啥芯片?
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-11-17
在线时间
12 小时
 楼主| 发表于 2018-8-31 10:16:02 | 显示全部楼层

STM32F103R8T6
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-8-31 10:30:41 | 显示全部楼层
    GPIO_SetBits(GPIOA, GPIO_Pin_1);//就是这一行,PA1无法输出高电平,UART2的PA8也是一样,无法输出高电平
    PAout(1) = 0;   
  你先设置了PA1为1,又让它输出0
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-8-31
在线时间
6 小时
发表于 2018-8-31 17:52:26 | 显示全部楼层
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
为啥是复用推挽你考虑过吗

回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-11-17
在线时间
12 小时
 楼主| 发表于 2018-9-17 15:03:48 | 显示全部楼层
军哥天天向上 发表于 2018-8-31 17:52
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
为啥是复用推挽你考虑过吗

没仔细考虑过
回复

使用道具 举报

0

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-3-21
在线时间
45 小时
发表于 2018-9-17 15:26:28 | 显示全部楼层
控制485用普通推挽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 20:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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