打印

请教香一主:用了HSI后,我的10B开发板

[复制链接]
3252|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sibaidong|  楼主 | 2010-11-13 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前一直用的比较好,没什么异常,自从采用内部HSI后,先是出现USART1工作不正常,然后出现J-LINK没法写入程序,并报如错误:“Wrong AHB ID (15:3).Expected 0x04770001 (Mask 0x0FFFFF0F), Fund 0xFFFFFFFF”。现在J-LINK没办法烧入了这块板了,ST-LINK也没办法Hold Core了。可里面以前写的程序即还正常跑着。
大家有没有遇到过,请教了!
沙发
香水城| | 2010-11-13 18:09 | 只看该作者
你只说现象,不说过程,谁知道发生什么事情。多给点细节吧。

使用特权

评论回复
板凳
pkat| | 2010-11-13 20:32 | 只看该作者
没有碰到过

使用特权

评论回复
地板
sibaidong|  楼主 | 2010-11-14 01:08 | 只看该作者
这就是目前的细节,直接烧录不了。至于之前,一直有个带UART1的工程,由于发送有问题,烧写了N次,最后发现一个规律地:复位后用单步执行,UART1发送不存在问题,接着持续下去也没问题;复位后直接持续执行,然后去按板上的硬件复位,UART1发送就不行了,有问题,但接收正常。后来试了几遍,还搞得我的J-LINK烧录不了,工程周一上传吧。现在直接写不进程序了,可里面的程序还跑着呢,还有以前的工程在内。灯闪了,但就没数据出来。

使用特权

评论回复
5
香水城| | 2010-11-14 10:34 | 只看该作者
我说的细节是:程序的功能,尤其是除USART1之外的功能;USART1初始化的过程,USART1发送接收的过程;所有I/O脚、至少是相关I/O脚的配置和操作方式等。。。。。。

不要指望别人帮你从代码里找问题。

使用特权

评论回复
6
sibaidong|  楼主 | 2010-11-14 11:20 | 只看该作者
这是源码,麻烦香主粘到SI里面查看吧!
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     
//  uint8_t i;
  /* System Clocks Configuration */
  RCC_Configuration();
      
  /* NVIC configuration */
  NVIC_Configuration();
  /* Configure the GPIO ports */
  GPIO_Configuration();
  Uart1_Configuration();
  delay_n_1ms(1000);
  
  SendBuffer(Buffer1,TxBufferSize);
while(1)
{
  if((RxBuffer[RxCounter-2] == 0x0D)&&(RxBuffer[RxCounter-1] ==0x0A))
  {
   SendBuffer(RxBuffer,RxCounter);
   RxBuffer[RxCounter-2] = 0;
   RxCounter = 0 ;
   
  }

}
}
/**
  * @brief  Configures the different system clocks.
  * @param  None
  * @retval None
  */
void RCC_Configuration(void)
{   
    RCC_DeInit();
    RCC_HSICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
  {}
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = 4MHz * 16 = 64 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USART1 Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  
  /* Configure USART1 Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure LED function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
}
/**
  * @brief  Configures the nested vectored interrupt controller.
  * @param  None
  * @retval None
  */
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
void Uart1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
  
/* USART1 configuration ------------------------------------------------------*/
  /* USART1 configured as follow:
        - BaudRate = 19200 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
  USART_InitStructure.USART_BaudRate = 56000;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  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;
  /* Configure USART1 */
  USART_Init(USART1, &USART_InitStructure);
  
  /* Enable USART1 Receive and Transmit interrupts */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE);
}

void SendBuffer(uint8_t* p,uint8_t num)
{
uint8_t TxCounter;
   for(TxCounter=0;TxCounter<num;TxCounter++)
   {
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET)
    {
    }
    USART_SendData(USART1,p[TxCounter]);
   }
}

使用特权

评论回复
7
sibaidong|  楼主 | 2010-11-15 10:04 | 只看该作者
顶一下!
这是中断处理:
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
          if(RxInc>20)
                RxInc = 0;
       
          if((RxBuffer[RxInc-2] != 0x0D) && (RxBuffer[RxInc-1] != 0x0A))
                RxBuffer[RxInc++] = USART_ReceiveData(USART1);
  }
}
这里是.S的局部修改:
line 49:   EXTERN  RCC_Configuration         ;SystemInit
line 125: LDR     R0, =RCC_Configuration        ;SystemInit

其它代码都是采用的是库文件,请教香主了。

使用特权

评论回复
8
jgphu| | 2010-11-15 11:20 | 只看该作者
采用HSI的话,如果波特率比较高的话,会出现数据接收不准确的现象,这跟HSI的偏差有关系,你上例中的波特率为56000, 波特率已经比较高了,建议采用外部晶体。

使用特权

评论回复
9
sibaidong|  楼主 | 2010-11-15 11:42 | 只看该作者
这是之前的源码,后来也考虑这方面的因素,改成9600,别的地方也就只加了个延时,可还是一样!现在的主要的问题是:用这种方式,持续调试了几次,为什么让我的10B板上的STM32芯片都烧录不了?

使用特权

评论回复
10
sibaidong|  楼主 | 2010-11-16 09:40 | 只看该作者
继续等待!

使用特权

评论回复
11
moo39lhc8| | 2010-11-16 10:56 | 只看该作者
谁知道发生什么事情

使用特权

评论回复
12
sibaidong|  楼主 | 2010-11-17 09:39 | 只看该作者
用华强北的**版J-LINK可以下载程序,可是UART1的问题还是存在,继续等待!

使用特权

评论回复
13
sibaidong|  楼主 | 2010-11-17 09:58 | 只看该作者
应该叫增强版J-LINK
UART1配置我根本没变,之前用HSE时就是这种配置,一点问题没有,正常得不能再正常,而且写这个配置绝对是参考ST官方例程来写的。
这里再声明一下:我不是让你们找代码原因;
这里再请教一下:同样的配置,采用HSI之后为什么会变成这样?还是我板上的芯片出了什么问题?
备注:因为我没有第二块10B板,所以过来求助。

使用特权

评论回复
14
sibaidong|  楼主 | 2010-11-25 10:16 | 只看该作者
忘了说一下,我换一个MCU芯片后,烧录一切都正常了,但还没时间试HSI那个程序,等有时间再试那个程序,看看会不会重现!

使用特权

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

本版积分规则

38

主题

342

帖子

0

粉丝