打印
[AT32F407]

exint问题

[复制链接]
770|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhjb1|  楼主 | 2024-11-13 17:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhjb1 于 2024-11-13 17:37 编辑

用Work_Bench创建了一个AT的工程,在做实验时能遇到一些问题,以后慢慢提问并解决。如果解决了,会将代码放上一起学习。
三、exint设置中断key的问题
在AWB中设置了5个exint中断输入,工程代码如下:
void wk_exint_config(void)
{
  /* add user code begin exint_config 0 */

  /* add user code end exint_config 0 */

  gpio_init_type gpio_init_struct;
  exint_init_type exint_init_struct;

  /* add user code begin exint_config 1 */

  /* add user code end exint_config 1 */

  /* configure the EXINT0 */
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = key0_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  gpio_init(key0_GPIO_PORT, &gpio_init_struct);

  gpio_exint_line_config(GPIO_PORT_SOURCE_GPIOA, GPIO_PINS_SOURCE0);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_0;
  exint_init_struct.line_polarity = EXINT_TRIGGER_FALLING_EDGE;
  exint_init(&exint_init_struct);

  /* configure the EXINT1 */
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = key1_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  gpio_init(key1_GPIO_PORT, &gpio_init_struct);

  gpio_exint_line_config(GPIO_PORT_SOURCE_GPIOB, GPIO_PINS_SOURCE1);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_1;
  exint_init_struct.line_polarity = EXINT_TRIGGER_BOTH_EDGE;
  exint_init(&exint_init_struct);

  /* configure the EXINT2 */
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = key2_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(key2_GPIO_PORT, &gpio_init_struct);

  gpio_exint_line_config(GPIO_PORT_SOURCE_GPIOB, GPIO_PINS_SOURCE2);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_2;
  exint_init_struct.line_polarity = EXINT_TRIGGER_BOTH_EDGE;
  exint_init(&exint_init_struct);

  /* configure the EXINT5 */
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = key3_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  gpio_init(key3_GPIO_PORT, &gpio_init_struct);

  gpio_exint_line_config(GPIO_PORT_SOURCE_GPIOE, GPIO_PINS_SOURCE5);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_5;
  exint_init_struct.line_polarity = EXINT_TRIGGER_BOTH_EDGE;
  exint_init(&exint_init_struct);

  /* configure the EXINT6 */
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  gpio_init_struct.gpio_pins = key4_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  gpio_init(key4_GPIO_PORT, &gpio_init_struct);

  gpio_exint_line_config(GPIO_PORT_SOURCE_GPIOE, GPIO_PINS_SOURCE6);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_6;
  exint_init_struct.line_polarity = EXINT_TRIGGER_BOTH_EDGE;
  exint_init(&exint_init_struct);

  /* add user code begin exint_config 2 */

  /* add user code end exint_config 2 */
}
分别是PA_0、PB_1、PB_2、PE_5、PE_6,PA_0板上已有用户键,后四个外加按键4个。设置为上拉,双向中断(将来有用)
看代码PA_0--EXINT_LINE_0;PB_1--EXINT_LINE_1;PB_2--EXINT_LINE_2;PE_5--EXINT_LINE_5;PE_6--EXINT_LINE_6
加入中断响应函数:
void EXINT0_IRQHandler(void){
if(exint_flag_get(EXINT_LINE_0) != RESET){
  kk=100;
  exint_flag_clear(EXINT_LINE_0);
}
}
void EXINT1_IRQHandler(void){
if(exint_flag_get(EXINT_LINE_1) != RESET){
  kk=201;
  exint_flag_clear(EXINT_LINE_1);
}
}
void EXINT2_IRQHandler(void){
if(exint_flag_get(EXINT_LINE_2) != RESET){
  kk=202;
  exint_flag_clear(EXINT_LINE_2);
}
}
代码只是将按下间的键值赋给kk变量而后在LCD上显示结果,前三个,没有问题,后两个就报错,遍历项目所有文档,没有PE_5,PE_6的EXINT_LINE_5和EXINT_LINE_6这两个中断线,可以找到EXINT_LINE_n的初设程序,是否需要自己创建这两个EXINT_LINE_5和6呢?比葫芦画瓢设置了一下,报错一片。

发帖咨询如何将这两个PE_5,PE_6IO口的中断按键响应也弄出来,尽管3个已经够用了,实验吗。
此实验还有三个IO--input,这个简单。
先谢谢了。

使用特权

评论回复
沙发
我喜欢打游戏| | 2024-11-13 20:23 | 只看该作者
这是哪个芯片,具体的型号说明一下

使用特权

评论回复
板凳
zhjb1|  楼主 | 2024-11-13 20:38 | 只看该作者
本帖最后由 zhjb1 于 2024-11-13 20:43 编辑

AT32F407VGT7,Sorry,提问上边写错了,EXINT_LINE_0->EXINT_LINE_19,一共20 个,这2个线有,下边的
EXINT5_IRQn、EXINT6_IRQn没有,无法设置这个中断获得键值。

使用特权

评论回复
地板
呐咯密密| | 2024-11-13 20:53 | 只看该作者
EXINT5_IRQn、EXINT6_IRQn这两个就是没有的,因为5-9是公用一个中断函数的,应该是EXINT9_5_IRQn

使用特权

评论回复
5
zhjb1|  楼主 | 2024-11-14 08:18 | 只看该作者
呐咯密密 发表于 2024-11-13 20:53
EXINT5_IRQn、EXINT6_IRQn这两个就是没有的,因为5-9是公用一个中断函数的,应该是EXINT9_5_IRQn ...

谢谢您,我试试EXINT9_5_IRQn
实际上还可以找到:EXINT4_IRQHandler,EXINT15_10_IRQHandler
我可以都试试。
已测试过一个,按下键后,以前能用的也就失常了。估计停在中断处理上了
再次感谢

使用特权

评论回复
6
zhjb1|  楼主 | 2024-11-14 08:35 | 只看该作者
本帖最后由 zhjb1 于 2024-11-14 09:50 编辑

呐咯密密
您好!测试EXINT9_5_IRQn成功了,代码如下:
void EXINT9_5_IRQHandler(void){//EXINT9_5_IRQHandler//EXINT4_IRQHandler//EXINT15_10_IRQHandler
if(exint_flag_get(EXINT_LINE_5|EXINT_LINE_6) != RESET){
  if(gpio_input_data_bit_read(GPIOE,key3_PIN))kk=55;
  if(gpio_input_data_bit_read(GPIOE,key4_PIN))kk=56;
  exint_flag_clear(EXINT_LINE_5);
  exint_flag_clear(EXINT_LINE_6);
}
}
中断响应后两个键都复位,偷懒了,谢谢!比较好点的代码如下:
void EXINT9_5_IRQHandler(void){//EXINT9_5_IRQHandler//EXINT4_IRQHandler//EXINT15_10_IRQHandler
if(exint_flag_get(EXINT_LINE_5) != RESET){
  if(gpio_input_data_bit_read(GPIOE,key3_PIN))kk=55;
  exint_flag_clear(EXINT_LINE_5);
}else if(exint_flag_get(EXINT_LINE_6) != RESET){
  if(gpio_input_data_bit_read(GPIOE,key4_PIN))kk=56;
  exint_flag_clear(EXINT_LINE_6);
}
}

实验中的状况,EXINT9_5_IRQHandler中断响应非常慢,通常按键好几下才弹出键值,而EXINT0_IRQHandler、EXINT1_IRQHandler、EXINT2_IRQHandler一个键对应一个中断的响应相当快,按键出值。不知何因?希望讨论解决,谢谢

使用特权

评论回复
7
呐咯密密| | 2024-11-14 20:28 | 只看该作者
zhjb1 发表于 2024-11-14 08:35
呐咯密密
您好!测试EXINT9_5_IRQn成功了,代码如下:
void EXINT9_5_IRQHandler(void){//EXINT9_5_IRQHand ...

问题在于你中断函数中对于按键检测的代码,你是上拉,那按下就是低电平,你检测的 if(gpio_input_data_bit_read(GPIOE,key3_PIN))是高电平。程序执行非常快,而你的按键弹开很慢,你应该检测低电平。

使用特权

评论回复
8
zhjb1|  楼主 | 2024-11-15 13:44 | 只看该作者
谢谢您,我试试取反就是低电平了

使用特权

评论回复
9
zhjb1|  楼主 | 2024-11-15 14:05 | 只看该作者
本帖最后由 zhjb1 于 2024-11-15 19:08 编辑

是滴,就像您说的,取反后立即响应了——我的硬件电路有延时电容,所以有时按半天才改过来键值。谢谢。
顺便能帮我解决ADC的问题吗,目前无论是走纯ADC还是DMA都无法取值!
比较麻烦的是我选择了5路ADC:ADC1_IN1,ADC1_IN2,ADC1_IN3,ADC1_IN6,ADC_IN7。都不出数据,按照STM的循环读取ADC赋值数组也没有结果。这是一
第二个问题是,目前tick没有问题,但他是mS计时,我想用Timer6做内部计数循环,产生一个自定义数:nus,设置软件触发 计数nus,或产生中断,结果都不成功。参考过本网站的TMR定时微秒,也参考过官网的设置。
比较麻烦的是我已经用了Timer1,Timer3,Timer4,Timer8作为独立PWM,没有问题,TMR6下载还没有通过。在我的工程中:ADC1和TMR6都用DMA2_CANNAL4_5,设置DMA2_Channel4_5_IRQHandler判断ADC或TMR6都无效;不用DMA直接软起动也都不行,这里有点抓瞎了。
AT32F407芯片性能不错,Flash RAM也大,可以利用这点做许多有用的东西。目前,实验就卡在这2 个问题上了。
I2C应该没有问题,以前调通过,USART1和USART3都通过了,XMC也移植成功,可以驱显多种大小不一的LCD。
再次谢谢您的指导。顺便说一下,目前还在选芯片的路上。同时采用的有:新塘的和NXP的M3或M4,也有用M0的想法。

使用特权

评论回复
10
呐咯密密| | 2024-11-15 17:26 | 只看该作者
ADC的问题比较复杂,先抛开不谈,你用滴答定时器做us延时肯定没问题的,如果例程是ms级别,你完全可以修改配置实现us级别的

使用特权

评论回复
11
zhjb1|  楼主 | 2024-11-15 19:02 | 只看该作者
本帖最后由 zhjb1 于 2024-11-15 19:13 编辑
呐咯密密 发表于 2024-11-15 17:26
ADC的问题比较复杂,先抛开不谈,你用滴答定时器做us延时肯定没问题的,如果例程是ms级别,你完全可以修改 ...

您好,我试过tick,如果/1000000就可以得到us,再加一个函数就是ms,我想在独立弄一个出来,就遇上麻烦了。现在的结果是XMC驱显TFTLCD没有问题,ADC显示的都为0,测内部的那一路显示的是0066,很小变动不对!
可以看出TFT全速显示没有余晖,而黑白的留有前边的数据——用的是SPI传输模式。
顺便说一下,AT32F407的IO口速度不错,如果不最求波形,PWM最快实验到50MHz,三角波,幅度掉了至少一半,可能还可以再快,估计的用汇编了。有时间测试一下IO口的输入响应速度,够快的话可以做一个频率计了。以前用PIC芯片做过,最高30MHz,误差优于1/10000 。
谢谢

AT32F407_Key_PWM_ADC_XMC.jpg (363.95 KB )

TFTLCD+128x64显示

TFTLCD+128x64显示

使用特权

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

本版积分规则

个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

59

主题

271

帖子

1

粉丝