|
本帖最后由 Gorgon_Meducer 于 2014-5-20 16:16 编辑
说在前面的话
这次是关于中断系统的接口……默默等待房产……
解释下:现在的格式是这样的,
- SIGNAL_CFG(
- SINGLE(<中断向量:SIGNAL0..SIGNAL31>, <信号源:手动信号 / 外设信号>, <信号用途:触发中断 / 触发外设功能>,
- <信号源的检测方式:上升沿,下降沿,双边沿,高电平,低电平,每xx次才触发一次>|<是否产生中断,其它属性>),
- ...
- )
复制代码 我关心的是对用户来说,这种方式是否灵活,易用。
比如,你可以吐槽我的例子比较渣,但是你立即就知道,并且有自己的欲望去实现一个自己的例子,关键就是你立即就知道如何自己去做
这是新版本编码规范的一个范例代码,包含对应的驱动模型和接口规范,我希望在不提供进一步解说的情况下听听大家
的意见,并提供以下信息:
1、第一眼给你的感受,是喜欢 恐惧 还是 茫然无措
2、顺次阅读代码后,代码要表达的意思你是否已经了解大概,表意是否清晰
3、有什么你觉得疑惑的地方?
4、有什么改进意见?
5、任何批评意见都是非常欢迎的
如果可能,希望大家能在回帖中描述下你理解的代码的行为。
这个库的目标就是要让代码使用起来简单,不仅仅要屏蔽底层的寄存器操作,还要做到功能和意义一目了然。
参与的人,即便自觉是菜鸟,也不用觉得自己水平不够之类的,因为你们就是最终的用户,你们是最有发言权的!
非常感谢大家的参与。
P.S: 这个库将是未来一个实质性的半导体产品的系统库。
范例一:USART数据接收完成中断
- SIGNAL_CFG(
- //! 一旦USART0的接收缓冲区中有数据(Data Available),就产生中断,并复位TIMER0
- SINGLE( SIGNAL0, USE_SIGNAL_USART0_RX_FIFO_DAVL, TO_TRIGGER(INTERRUPT_REQUEST , TIMER0_RESET), EVERY_TIME ),
- //! 如果很久没有发生USART0的接收事件,导致TIMER0溢出了,就认为发生了接收超时,触发中断处理程序
- SINGLE( SIGNAL1, USE_SIGNAL_TIMER0_OVF, TO_TRIGGER(INTERRUPT_REQUEST), EVERY_TIME),
- );
- ISR(SIGNAL0_vect)
- {
- //! Signal0 的中断处理程序,当USART的接收缓冲区中存在数据时,该中断被触发
- }
- ISR(SIGNAL1_vect)
- {
- //! Signal1 的中断处理程序, 定时器0的溢出事件触发,表示USART通信超时,用TIMER0的TOP值设置超时范围
- }
复制代码 范例二:用DMA从USART接收数据
这是直接用DMA的例子,当USART0的缓冲区中有数据可用的时候,自动触发DMA进行搬运
- #define USART0_RX_BUFFER_SIZE 256
- static uint8_t s_chUSARTBuffer[USART0_RX_BUFFER_SIZE];
- static void start_usart_dma_transfer(void)
- {
- DMA_CHN_CFG(
- DMA_CHANNEL0, //!< 使用DMA的通道0
- DMA_CHN_BURST_TRANSFER | //!< 分多次完成数据传输
- DMA_CHN_BURST_SIZE_1, //!< 每次传输一个数据(数据类型由DMA_TSF_CFG指定)
-
- //! 配置一次传输
- DMA_TSF_CFG (
- DMA_TSF_MODE_PERIPHRAL_TO_MEMORY, //!< 从外设到内存的搬运方式
- DMA_TSF_DATA_BITS_BYTE, //!< 每次搬运的数据类型是字节
- &GSP_USART0.RBR_THR_DLL.RBR.Value, //!< 源地址
- s_chUSARTBuffer //!< 目标地址
- )
- );
- }
- void app_init(void)
- {
- ...
- SIGNAL_CFG(
- //! 一旦USART0的接收缓冲区中有数据(Data Available),就触发DMA通道0从USART版运数据
- SINGLE( SIGNAL0, USE_SIGNAL_USART0_RX_FIFO_DAVL, TO_TRIGGER(DMA0_CHN0_TSF), EVERY_TIME ),
- //! 当DMA完成指定数量数据的搬运后,触发中断,由中断来配置下一次的DMA
- SINGLE( SIGNAL1, USE_DMA_CHN0_FINAL_TSF, TO_TRIGGER(INTERRUPT_REQUEST), EVERY_TIME),
- );
- //! 配置USART0
- USART_CFG(
- USART0,
- USART_8_BIT_LENGTH | //!< 8数据位
- USART_1_STOPBIT | //!< 1停止位
- USART_NO_PARITY, //!< 无校验
- 9600 //!< 9600波特率
- );
- //! 配置DMA进行USART的数据传输
- start_usart_dma_transfer();
- ...
- }
- ISR(SIGNAL1_vect)
- {
- //! 配置下一次DMA传输
- start_usart_dma_transfer();
- }
复制代码 范例三:外中断
- SELECT_PIN_SIGNAL_SOURCE(PIN_CHN0, PA6);
- SELECT_PIN_SIGNAL_SOURCE(PIN_CHN1, PA7);
- SELECT_PORT_GROUP_SIGNAL_SOURCE(PORT_GROUP_CHN0, PB0_MSK | PB1_MSK | PB2_MSK | PB3_MSK)
- SIGNAL_CFG(
- //! 在PA6的第61个上升沿产生一个中断
- SINGLE(SIGNAL0, USE_SIGNAL_PIN_CHN0, TO_TRIGGER(INTERRUPT_REQUEST), ON_RAISING_EDGE | EVERY_61_TIME),
- //! 在PA7每保持低电平32个系统周期,产生一个中断
- SINGLE(SIGNAL1, USE_SIGNAL_PIN_CHN1, TO_TRIGGER(INTERRUPT_REQUEST), ON_LOW_LEVEL | EVERY_32_TIME),
- //! PB0, PB1, PB2, PB3 任何一个引脚的双边沿产生一个中断
- SINGLE(SIGNAL2, USE_SIGNAL_PORT_GROUP_CHN0, TO_TRIGGER(INTERRUPT_REQUEST), ON_BOTH_EDGE},
- )
- ISR(SIGNAL0_vect)
- {
- //! Signal0 的中断处理程序,
- }
- ISR(SIGNAL1_vect)
- {
- //! Signal1 的中断处理程序,
- }
- ISR(SIGNAL2_vect)
- {
- //! Signal2 的中断处理程序,
- }
复制代码 |
|