打印
[STM32F1]

STM32F103RE使用TIM3问题请教

[复制链接]
2894|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人正在使用STM32F103RE驱动0V2640摄像头,原理都是参考https://blog.csdn.net/ZLK1214/article/details/79559466,原理图上有些差异,本人的单片机是PB14(VSYNC)和PB5(=~(HREF & PCLK)),附上我修改后的配置,OV2640初始化配置可以正常配置好,但是无法产生PB14中断,还请大佬看看,哪里有问题!跪谢!
int main(void)
{
  RCC->AHBENR |= RCC_AHBENR_CRCEN | RCC_AHBENR_DMA1EN;
  RCC->APB1ENR = RCC_APB1ENR_I2C1EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM6EN;
  RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_USART1EN;
  AFIO->MAPR = AFIO_MAPR_TIM3_REMAP_PARTIALREMAP;
  GPIOA->CRH = (GPIOA->CRH & 0xfffff00f) | 0x4b0; // 串口发送引脚PA9设为复用推挽输出
  GPIOB->CRL = (GPIOB->CRL & 0x00ffffff) | 0xff000000; // PB6~7连接摄像头的I2C接口, 设为复用开漏输出
  // PB14(VSYNC)和PB5(=~(HREF & PCLK))为浮空输入
  // PC0~7是摄像头的8位数据引脚, 为浮空输入

  USART1->BRR = SystemCoreClock / 115200;
  USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;

  I2C1->CR2 = 36; // APB1总线频率: 36MHz
  I2C1->CCR = 1800; // 速率: 10kHz (不可太高, 否则会导致Ack Failure; 计算公式为PCLK1/nf, 标准模式下n=2)
  I2C1->TRISE = 37; // 标准模式下为PCLK+1
  I2C1->CR1 = I2C_CR1_PE; // 打开I2C总线

  // 每当PB5上出现下降沿时, 就发送一次DMA请求, 采集GPIOC低8位的数据
  TIM3->CCMR1 = TIM_CCMR1_CC1S_1; // PB5(TIM3_CH2)映射到TIM3_CH1上
  TIM3->CCER = TIM_CCER_CC1P; // 下降沿触发
  TIM3->CCER |= TIM_CCER_CC1E; // 打开TIM4_CH3的输入捕获
  // 无需让定时器3开始计时, 这里只使用该定时器的一个输入捕获通道

  // 配置TIM3_CH1对应的DMA通道
  DMA1_Channel6->CMAR = (uint32_t)image_buffer;
  DMA1_Channel6->CPAR = (uint32_t)&GPIOC->IDR;
  DMA1_Channel6->CNDTR = sizeof(image_buffer); // 超出部分会被自动丢弃!! 所以图像不能大于64480字节
  DMA1_Channel6->CCR = DMA_CCR6_PL | DMA_CCR6_MINC | DMA_CCR6_EN;

  OV2640_Init(JPEG_800x600);

  // 打开PB14外部中断
  AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI14_PB;
  EXTI->IMR = EXTI_IMR_MR14;
  EXTI->RTSR = EXTI_RTSR_TR14; // PB14上的上升沿能触发中断
  EXTI->FTSR = EXTI_FTSR_TR14; // PB14上的下降沿也能触发中断
  NVIC_EnableIRQ(EXTI15_10_IRQn); // 允许执行中断服务函数

  while (1)
  {
    if (image_state == (STATE_START | STATE_STOP))
    {
      printf("size=%d\n", image_size);
      dump(image_buffer, image_size); // 通过串口发送图像, 然后附上CRC校验值

      // 让DMA内部指针回到数组的开头
      DMA1_Channel6->CCR &= ~DMA_CCR6_EN;
      DMA1_Channel6->CNDTR = sizeof(image_buffer);
      DMA1_Channel6->CCR |= DMA_CCR6_EN;

      image_state = 0; // 允许采集新图像 (这条语句一次性把START和STOP都清0了)
    }
  }
}

void EXTI0_IRQHandler(void)
{
  EXTI->PR = EXTI_PR_PR14; // 清除中断标志位
  if (GPIOB->IDR & GPIO_IDR_IDR14)
  {
    // PB14上升沿表示图像数据传输开始
    if (image_state != 0)
      return; // 如果图像已经开始采集了, 就忽略这个开始信号
    image_state = STATE_START;

    // 打开TIM3_CH1对应的DMA通道, 开始采集数据
    TIM3->DIER = TIM_DIER_CC1DE; // 允许PB5上的下降沿触发DMA请求
  }
  else
  {
    // PB14下降沿表示图像数据传输结束
    if ((image_state & STATE_START) == 0 || (image_state & STATE_STOP))
      return; // 忽略没有开始信号的结束信号, 以及重复的结束信号
    image_state |= STATE_STOP;

    TIM3->DIER &= ~TIM_DIER_CC1DE; // 停止采集
    image_size = sizeof(image_buffer) - DMA1_Channel6->CNDTR; // 总量-剩余数据量=图像大小
  }
}


使用特权

评论回复
沙发
yangjiaxu| | 2021-12-8 11:07 | 只看该作者
网上应该有这个例程吧,正点原子好像都有,你去参考参考呗。

使用特权

评论回复
板凳
jgp886585| | 2021-12-8 11:08 | 只看该作者
首先第一个,不要在中断里处理那么数据,中断里一般置标志就可以了

使用特权

评论回复
地板
jgp886585| | 2021-12-8 11:09 | 只看该作者
GPIO的时钟这些配置没有?

使用特权

评论回复
5
单片小菜| | 2021-12-8 11:09 | 只看该作者
你的中断应该是进不去的,初始化IO口的部分我看了一下,应该是有问题。程序写的很乱,你初始化IO之后,要进行中断初始化,然后在重新初始化GPIO部分。
另外,建议你在调试的时候,你把其它部分的代码屏蔽掉,只是测试PB14是否可以进入中断,这样先把硬件的问题排查了,之后,再进行软件问题的排查,如果你这样既有硬件,又有软件的话,会浪费很多时间去解决问题的。

使用特权

评论回复
6
NIKEjian|  楼主 | 2021-12-8 12:03 | 只看该作者
jgp886585 发表于 2021-12-8 11:09
GPIO的时钟这些配置没有?

有的,在最开始就配置了GPIO的时钟

使用特权

评论回复
7
呐咯密密| | 2021-12-8 12:23 | 只看该作者
你的代码确实很乱,回归到问题本身,你在初始化中断时有设置NVIC吗?我并没有看到你的NVIC配置,你没有给你的中断设置通道分组和优先级呀。

使用特权

评论回复
8
NIKEjian|  楼主 | 2021-12-8 14:00 | 只看该作者
yangjiaxu 发表于 2021-12-8 11:07
网上应该有这个例程吧,正点原子好像都有,你去参考参考呗。

我这个也是参考网上别人的例程,正点原子的在哪里下载呀,能给个链接吗?多谢啦

使用特权

评论回复
9
呐咯密密| | 2021-12-8 14:21 | 只看该作者
NIKEjian 发表于 2021-12-8 14:00
我这个也是参考网上别人的例程,正点原子的在哪里下载呀,能给个链接吗?多谢啦
...

http://www.openedv.com/docs/boards/stm32/zdyz_stm32f103_jingying.html
这是下载中心,进去后下载这个就行了

使用特权

评论回复
10
怀揣少年梦| | 2021-12-9 09:05 | 只看该作者
代码应该没有把中断映射到中断线上

使用特权

评论回复
11
NIKEjian|  楼主 | 2021-12-9 09:38 | 只看该作者
怀揣少年梦 发表于 2021-12-9 09:05
代码应该没有把中断映射到中断线上

能具体点帮我说说吗?感谢!

使用特权

评论回复
12
90houyidai| | 2021-12-9 12:46 | 只看该作者
是不是中断回调错了

使用特权

评论回复
13
tpgf| | 2022-1-7 15:43 | 只看该作者
这个引脚有特殊功能吗

使用特权

评论回复
14
renzheshengui| | 2022-1-7 15:49 | 只看该作者
是不是中断向量不对了

使用特权

评论回复
15
wakayi| | 2022-1-7 15:51 | 只看该作者
原子的例程非常容易找

使用特权

评论回复
16
wowu| | 2022-1-7 15:55 | 只看该作者
要是能用原子的板子调试就更方便了

使用特权

评论回复
17
xiaoqizi| | 2022-1-7 15:57 | 只看该作者
需要重新定义一下吗

使用特权

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

本版积分规则

4

主题

15

帖子

0

粉丝