打印

请问香主关于STM32F103C8T6的几个问题?

[复制链接]
8428|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
S448|  楼主 | 2009-7-25 00:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.STM32F103C8T6是不是有3个串口,而STM32F103C6T6有两个串口?

2.STM32F103C8T6的21管脚为PB10/SCL2/TX3,22管脚为PB11/SDA2/RX3,怎么设置我是当作普通I/O口,怎么设置作为串口,怎么设置作为硬件I2C口,请详细解答,最好给出设置代码,因为一点设置错就调不好。(我想当作串口用,可无论如何就进不去串口3中断).


先谢谢香主!
沙发
香水城| | 2009-7-25 08:43 | 只看该作者

STM32复用的GPIO引脚配置方式

STM32所有内置外设的外部引脚都是与标准GPIO引脚复用的,例如你举的这个例子,21管脚为PB10/SCL2/TX3,表示在上电之后它的默认功能为PB10,而I2C2的SCL和USART3的TX为它的复用功能。

STM32基本上每个引脚都有8种配置模式:
1)浮空输入
2)带弱上拉输入
3)带弱下拉输入
4)模拟输入
5)推挽输出
6)开漏输出
7)复用推挽输出
8)复用开漏输出

通常有5种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通GPIO输入:根据需要配置该引脚为浮空输入带弱上拉输入带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2)作为普通GPIO输出:根据需要配置该引脚为推挽输出开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入带弱上拉输入带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出复用开漏输出,同时使能该引脚对应的所有复用功能模块。

注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。


比如你要使用21、22脚的USART3功能,则需要配置21脚为复用推挽输出或复用开漏输出,配置22脚为某种输入模式,同时使能USART3并保持I2C2的非使能状态。

使用特权

评论回复
板凳
S448|  楼主 | 2009-7-27 19:13 | 只看该作者

怎么同时使能USART3并保持I2C2的非使能状态?

看看我的串口配置参数吧,有什么不对吗?485芯片用的2483。还是调不同,用示波器能看到发送的数据进入了CPU管脚,可就是进不去串口3的中断。


#define RS485_1_Rx_CS  GPIO_SetBits(GPIOA, GPIO_Pin_15)  //PA15
#define RS485_1_Tx_CS  GPIO_ResetBits(GPIOA, GPIO_Pin_15)

void COM_Init(void)
{
      GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;                //串口参数

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);    //因PA15还有调试功能,所以要关掉
/*RS485通讯接口*/
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;                //配置RX(PB11)
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;                //配置Tx(PB10)
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_15;                //配置收发切换管脚
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);    
    USART_InitStructure.USART_BaudRate= 9600;    //串口参数设置
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
    USART_InitStructure.USART_Parity = USART_Parity_No ;     //无校验
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;
    
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART3, &USART_InitStructure);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);     //打开接收中断


    USART_Cmd(USART3, ENABLE);  
    
    RS485_1_Rx_CS;     //打开485的接收中断
}

使用特权

评论回复
地板
S448|  楼主 | 2009-7-27 19:16 | 只看该作者

我以前用的100脚的103VB不存在这个问题啊?

难道买的片子是103c6仿冒的103C8的?郁闷死了,该怀疑的都怀疑了。

使用特权

评论回复
5
香水城| | 2009-7-27 21:05 | 只看该作者

打开了对应的时钟吗?

为什么不先试试发送?

“同时使能USART3并保持I2C2的非使能状态”——就是使能USART3的同时不要使能I2C2。

使用特权

评论回复
6
kbgyzp| | 2009-7-28 09:51 | 只看该作者

打开时钟了啊

void SetupClock (void)
{
  RCC_DeInit ();                        //将外设RCC寄存器重设为缺省值
  RCC_HSEConfig (RCC_HSE_ON);           //设置外部高速晶振(HSE)

  while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);     //检查指定的RCC标志位设置与否

  RCC_HCLKConfig   (RCC_SYSCLK_Div1);     //设置AHB时钟(HCLK)
  RCC_PCLK2Config  (RCC_HCLK_Div1);     //设置高速AHB时钟(PCLK2)
  RCC_PCLK1Config  (RCC_HCLK_Div2);     //设置低速AHB时钟(PCLK1)
  RCC_ADCCLKConfig (RCC_PCLK2_Div4);    //设置ADC时钟(ADCCLK)

  *(vu32 *)0x40022000 = 0x01;           /* Flash 2 wait state                 */
  RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    //设置PLL时钟源及倍频系数

  RCC_PLLCmd (ENABLE);                                  //使能或者失能PLL
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);    //检查指定的RCC标志位设置与否

  RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);              //设置系统时钟(SYSCLK)选择PLL作为系统时钟
  while (RCC_GetSYSCLKSource() != 0x08);                   //返回用作系统时钟的时钟源
  
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) ;//设置SysTick时钟源为AHB时钟除以8
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA |       //DMA时钟
                          RCC_AHBPeriph_SRAM,    //SRAM时钟
                        ENABLE); //使能或者失能AHB外设时钟
  
  RCC_APB2PeriphClockCmd (    
                              RCC_APB2Periph_AFIO     |
                              RCC_APB2Periph_GPIOA |        //GPIOA时钟
                              RCC_APB2Periph_GPIOB |        //GPIOB时钟
                                RCC_APB2Periph_GPIOC |        //GPIOC时钟
                            RCC_APB2Periph_GPIOD |       //GPIOD时钟
                            RCC_APB2Periph_GPIOE |       //GPIOE时钟
                            RCC_APB2Periph_ADC1  |       //ADC1时钟
                            RCC_APB2Periph_ADC2  |       //ADC2时钟
                            RCC_APB2Periph_TIM1  |       //TIM1时钟
                            RCC_APB2Periph_USART1,       //USART1时钟
                            ENABLE);//使能APB2外设时钟
  RCC_APB1PeriphClockCmd(    RCC_APB1Periph_TIM2|
                              RCC_APB1Periph_TIM3|
                            RCC_APB1Periph_TIM4|
                            RCC_APB1Periph_USART2|
                            RCC_APB1Periph_USART3|
                            RCC_APB1Periph_BKP,                             
                            ENABLE);
  /* SysTick event each 1 ms with input clock equal to 9MHz (HCLK/8)         */
  SysTick_SetReload(9000);        //设置SysTick重装载值(1ms)
  SysTick_ITConfig(ENABLE);          //使能或者失能SysTick中断
}

使用特权

评论回复
7
kbgyzp| | 2009-7-28 09:52 | 只看该作者

中断优先级也设置了

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM  
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  //设置向量表的位置和偏移量,指定中断向量表在RAM
#else  
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//设置向量表的位置和偏移量,指定中断向量表在代码存储器中   
#endif

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//配置优先级组:优先级和字优先级,0位优先级,4位子优先级

  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQChannel;     //ADC全局中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;      //这个成员配置了在NVIC_IRQChannel 成员中指定的IRQ 通道的优先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;          //USART3全局中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);             
 
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = DMAChannel2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

}

使用特权

评论回复
8
kbgyzp| | 2009-7-28 09:53 | 只看该作者

实在想不到还有什么原因

发送数据也发不出来

使用特权

评论回复
9
香水城| | 2009-7-28 10:05 | 只看该作者

这样看我也看不出来有什么问题

你把问题简化一下,做一个只包含USART3的小项目,把所有其它部分去掉。

使用特权

评论回复
10
vigia| | 2009-7-28 15:07 | 只看该作者

配置IO口要设置速度的

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

这句话呢?

使用特权

评论回复
11
yulri| | 2010-12-11 16:18 | 只看该作者
学习了!!

使用特权

评论回复
12
yulri| | 2010-12-11 16:21 | 只看该作者
学习了!!

使用特权

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

本版积分规则

35

主题

519

帖子

2

粉丝