-
国产MCU自带IDE的有几家
我记得之前见过一家用.net做的IDE,今天下载了几个都不是。1 芯旺 ChipON KungFu 基于eclipse 仿PIC 2 芯海 ChipSea CSU 基于visual studio,和某个版本的avr studio差不多, 3 中颖 Sinowealth 使用keil和IAR 基于8051和ARM 4 ... 怎么找不到自定义指令集用c# + winform开发的那家了呢?
3175浏览量 5回复量 关注量 -
GD32F303 串口DMA发送问题
[i=s] 本帖最后由 jsrdczy 于 2021-11-22 15:55 编辑 [/i] 兄弟萌,有一个关于gd32的串口dma发送问题:场景描述:串口DMA发送数据,一般的做法是开DMA发送完成中断,然后在中断里切换发送状态或者进行下一次传输。 思路描述:如果是485传输,如果用DMA发送完成中断的话,在中断里发送改为接收状态时,可能会丢1个字节。所以沿用之前stm32的做法,打开串口的发送完成中断,利用tc中断在串口中断服务程序中切换状态或者进行下一帧发送。 问题:之前stm32的工程就是用串口tc发送完成中断来标识发送完成的,但是同样的做法在gd32上,虽然能够进行入tc中断,但是发送出来的数据完全不对。解决办法:dma通道使能后delay 3个ms 就可以发送正确发送了,和开dma或者串口tc中断没有关系。 贴一部分代码: DMA配置: static void gd32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag) { struct dma_config *dma_config; struct gd32_uart *uart; dma_parameter_struct dma_init_struct; RT_ASSERT(serial != RT_NULL); uart = (struct gd32_uart *)serial->parent.user_data; if (RT_DEVICE_FLAG_DMA_TX == flag) { dma_config = uart->dma_tx; } else if(RT_DEVICE_FLAG_DMA_RX == flag) { return ; // no support temporarily } //enable dma clock rcu_periph_clock_enable(dma_config->dma_rcu); //initillize DMA channel dma_deinit(dma_config->dma_periph, dma_config->channel); dma_struct_para_init(&dma_init_struct); dma_channel_disable(uart->dma_tx->dma_periph,uart->dma_tx->channel); dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; dma_init_struct.memory_addr = RT_NULL; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; dma_init_struct.number = 0; dma_init_struct.periph_addr = (uint32_t)&USART_DATA(uart->uart_periph); dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; dma_init(dma_config->dma_periph, dma_config->channel, &dma_init_struct); dma_circulation_disable(dma_config->dma_periph, dma_config->channel); dma_memory_to_memory_disable(dma_config->dma_periph, dma_config->channel); if (RT_DEVICE_FLAG_DMA_TX == flag) { usart_flag_clear(uart->uart_periph, USART_FLAG_TC); //clear flag dma_interrupt_flag_clear(uart->dma_tx->dma_periph, uart->dma_tx->channel,DMA_FLAG_G); /* enable rx irq */ NVIC_EnableIRQ(uart->irqn); /* enable interrupt */ usart_interrupt_enable(uart->uart_periph, USART_INT_TC); //uart tc send complete interrupt usart_dma_transmit_config(uart->uart_periph, USART_DENT_ENABLE); } #endif } DMA发送 static rt_size_t gd32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) { struct gd32_uart *uart; RT_ASSERT(serial != RT_NULL); RT_ASSERT(buf != RT_NULL); uart = (struct gd32_uart *)serial->parent.user_data; struct rt_serial_tx_dma *tx_dma; tx_dma = (struct rt_serial_tx_dma*)(serial->serial_tx); if (size == 0) { return 0; } if (RT_SERIAL_DMA_TX == direction) { dma_channel_disable(uart->dma_tx->dma_periph,uart->dma_tx->channel); dma_interrupt_flag_clear(uart->dma_tx->dma_periph, uart->dma_tx->channel,DMA_FLAG_G); usart_flag_clear(uart->uart_periph, USART_FLAG_TC); //clear flag dma_memory_address_config(uart->dma_tx->dma_periph,uart->dma_tx->channel,(uint32_t)buf); dma_transfer_number_config(uart->dma_tx->dma_periph,uart->dma_tx->channel,size); dma_channel_enable(uart->dma_tx->dma_periph,uart->dma_tx->channel); [color=#ff0000]//rt_thread_mdelay(3); 这里delay就能发送[/color] return size; } return 0; } 串口发送完成中断(tc)处理: static void uart_isr(struct rt_serial_device *serial) { struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data; rt_base_t level; rt_size_t trans_total_index; RT_ASSERT(uart != RT_NULL); /* UART in mode Receiver -------------------------------------------------*/ if ((usart_interrupt_flag_get(uart->uart_periph, USART_INT_FLAG_RBNE) != RESET) && (usart_flag_get(uart->uart_periph, USART_FLAG_RBNE) != RESET)) { rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); /* Clear RXNE interrupt flag */ usart_flag_clear(uart->uart_periph, USART_FLAG_RBNE); } /* UART in mode Transmiter -------------------------------------------------*/ if ((usart_interrupt_flag_get(uart->uart_periph, USART_INT_FLAG_TC) != RESET) && (usart_flag_get(uart->uart_periph, USART_FLAG_TC) != RESET)) { if(dma_flag_get(uart->dma_tx->dma_periph, uart->dma_tx->channel,DMA_FLAG_FTF) == SET) { rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE); dma_interrupt_flag_clear(uart->dma_tx->dma_periph, uart->dma_tx->channel,DMA_FLAG_G); } /* Clear TC interrupt flag */ usart_flag_clear(uart->uart_periph, USART_FLAG_TC); } } 目前的现象就是tc中断可以进,发出来的字节数也对,但是内容除了头2个字节,其余的字节全都不对。换成DMA发送完成中断也是杨的现象 那位用gd32的大佬使用过,一起探讨下,看是否是我哪里配置有啥问题
2349浏览量 1回复量 关注量 -
请教AT32的GPIO时钟使能的问题
我看了AT32的系统架构图,GPIOA~GPIOE是直接挂在AHB总线上的:但是例程里使能GPIOA时钟时为什么是调用:RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA , ENABLE); 而不是调用:RCC_AHBPeriphClockCmd(RCC_APB2PERIPH_GPIOA , ENABLE);
2358浏览量 2回复量 关注量 -
GD32E503硬件I2C问题
求大佬们帮忙看看[img]https://bbs.21ic.com/static/image/smiley/comcom/9.gif[/img]刚开始搞编程,最近在学习GD32E503-Start的开发板,按照官方提供的固件库使用指南操作在使用硬件I2C的时候发现ADDSEND位一直不置1,导致程序一直卡在 [color=#f00000]while(!i2c_flag_get(i2c_periph,I2C_FLAG_ADDSEND));[/color] 检查硬件连接也没啥问题,把程序下进去之后,疯狂按复位,发现有那么几次ADDSEND被置1了,真的搞不清楚什么情况,求各位帮忙看看,代码是按照官方提供的例程写的,使用的是I2C1,PB10,PB11引脚 void lmp_reg_write(uint32_t i2c_periph, uint32_t lmp_reg, uint8_t datatransmit) { while(i2c_flag_get(i2c_periph,I2C_FLAG_I2CBSY)); i2c_start_on_bus(i2c_periph); while(!i2c_flag_get(i2c_periph,I2C_FLAG_SBSEND)); i2c_master_addressing(i2c_periph,LMP_ADDR_WRITE,I2C_TRANSMITTER); [color=#f00000]while(!i2c_flag_get(i2c_periph,I2C_FLAG_ADDSEND));[/color] i2c_flag_clear(i2c_periph,I2C_FLAG_ADDSEND); while(!i2c_flag_get(i2c_periph,I2C_FLAG_TBE)); i2c_data_transmit(i2c_periph,lmp_reg); while(!i2c_flag_get(i2c_periph,I2C_FLAG_TBE)); i2c_data_transmit(i2c_periph,datatransmit); while(!i2c_flag_get(i2c_periph,I2C_FLAG_BTC)); i2c_stop_on_bus(i2c_periph); while(I2C_CTL0(i2c_periph)&0x0200); } 供电我是直接用usb线到电脑上,连的gd-link那个usb口,也方便烧录。
4896浏览量 4回复量 关注量 -
华大的驱动库为何不支持GCC编译器?
有华大官方的人么?这两年STM32芯片贵而无货,无奈想转国产,发现华大芯片似乎不错,然而奈何驱动库不支持GCC,如果强上GCC就怕有坑。 我已经习惯在Linux上做开发,各种工具组合起来的工作效率比Windows的高很多,编译速度也快很多,习惯Eclipse系IDE + GCC工具链,工程编译时间通常都是一两秒钟左右。 华大为何不支持GCC编译器?
2673浏览量 1回复量 关注量 -
IPM(智能功率模块)在半桥电路中的使用问题 sos
[color=#333333][backcolor=rgb(255, 255, 255)][font=Arial, "][size=16px]各位前辈好,最近在做一个小项目,用IPM(型号是三菱的PM75B4L1C060)搭一个不对称半桥电路,如图1所示,目的是为了测量IPM的输出电流值。IPM里的②③IGBT我不使用,只使用它的体二极管,PN输入端并上800v 6800uf的电容,以及直流开关电源,在本次实验中加的电压值是50V,输出端UV接的是一个线圈里面加的硅钢片(相当于电磁铁,电感值6mH左右)。PM的控制信号是两个相位差为180°的PWM波,占空比为15%左右(此IPM是低电平有效),频率是15kHz,0~15V,PWM波的产生完全是模拟电路,如图2所示。在给PN输入端50V上电的瞬间,PN输入端的电流值如图3的蓝颜色波形所示,用电流钳测量的,大概是7A左右(感觉这个脉冲也只是杂波或纹波?示波器档位动一下,就没了),但也就这一瞬间,后面就还是0,输出端负载线圈的电流电压值都是0。想各位前辈请教一下,我接下来该怎么测试哈?控制信号输入的PWM波没问题,IPM也没问题(没有显示故障信号),所以为啥测不出电流呢?希望前辈能指导一下,谢谢了![/size][/font][/backcolor][/color][font=Arial, Microsoft YaHei, Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, sans-serif][color=#333333][backcolor=rgb(255, 255, 255)][size=16px]没法放图片!!![/size][/backcolor][/color][/font]
3442浏览量 0回复量 关注量 -
RCU库中没有AF sos
USART可以发送但不能接收,网上有的说要rcu_periph_clock_enable(RCU_AF),但我的RCU中没有AF时钟怎么办。
1275浏览量 0回复量 关注量 -
msp430AFE253IPW 芯片没有烧写软件时读出来的数据代表什么?
[color=rgb(65, 131, 196)][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px]msp430[/size][/font][/backcolor][/color][color=#333333][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px]AFE253IPW [/size][/font][/backcolor][/color][color=rgb(65, 131, 196)][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px]芯片[/size][/font][/backcolor][/color][color=#333333][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px]没有烧写软件时读出来的数据代表什么?[/size][/font][/backcolor][/color][font=微软雅黑][color=#333333][size=16px] [/size][/color][/font] [font=微软雅黑][color=#333333][size=16px] [/size][/color][/font][color=#333333][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px]红色字体代表什么?[/size][/font][/backcolor][/color] [color=#333333][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px] [/size][/font][/backcolor][/color] [color=#333333][backcolor=rgb(255, 255, 255)][font=微软雅黑][size=16px]@1000[/size][/font][/backcolor][/color] [backcolor=rgb(255, 255, 255)][size=16px][font=微软雅黑][b][color=#f00000]AA 55 FF 3F CD AB AA 55 34 12[/color][/b][color=#333333] FF FF FF FF FF FF [/color] [color=#333333]。。。。。。。。。。。。。。。。。。。。。。。[/color] FF FF FF FF FF FF FF FF FF FF[color=#f00000][b] A8 8E 99 8D FF FF[/b][/color][color=#333333] [/color] [color=#333333]@C000[/color] [color=#333333]FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF [/color] [color=#333333]FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF [/color] [/font][/size][/backcolor]
4112浏览量 8回复量 关注量 -
24LC64丢失数据
[table=98%] [tr][td]我公司使用MICROCHIP 24LC64-I/SN ,数量13000多个,目前有几百个有数据丢失的现象。 使用的地址范围是前面1K字节内,后面的地址没有用到。已发现0xE0--0xE5,0xF6--0x12A,0x12D等位置出现问题,现象是正常写完数据后立刻读出刚写的数据,写入的与读出的数据一致,没有问题,连续读取多次会出现读出的数据已经变化,板件即时重新上电也不会恢复。出问题的地址是个别位发生反转。有些板件正常写完数据后断电2分钟再上电发现读出的数据会变化,有些板件断电5分钟才变化,有些10分钟后变化.请各位大师帮忙分析下,不胜感激![/td][/tr] [/table] [align=left][float=right][color=rgb(68, 68, 68)][backcolor=rgb(222, 240, 251)][font=Tahoma, "][size=12px][color=rgb(51, 51, 51)][url=]使用特权[/url][/color][/size][/font][/backcolor][/color][/float][/align][float=right][color=rgb(102, 102, 102)][backcolor=rgb(222, 240, 251)][font=Tahoma, "][size=12px][color=rgb(51, 51, 51)][size=14px][url=]更多操作[/url][/size][/color][/size][/font][/backcolor][/color][/float]
12888浏览量 52回复量 关注量 -
请问TI-RTOS里swiParams.arg0里的arg0是用来做什么的? sos
[i=s] 本帖最后由 fondsjay 于 2020-12-25 13:32 编辑 [/i] Swi_create creates a new Swi object. The following C code sets Swi parameters and creates two Swi objects: Void main() { Swi_Params swiParams; Swi_Params_init(&swiParams); swiParams.arg0 = 1; swiParams.arg1 = 0; swiParams.priority = 2; swiParams.trigger = 0; swi0 = Swi_create(swi0Fxn, &swiParams, NULL); swiParams.arg0 = 2; swiParams.arg1 = 0; swiParams.priority = 1; swiParams.trigger = 3; swi1 = Swi_create(swi1Fxn, &swiParams, NULL); BIOS_start(); } 以上arg0和arg1是什么意思?定义时有什么讲究吗?
1551浏览量 0回复量 关注量 -
有偿请教关于18F66k22串口假死问题。
[i=s] 本帖最后由 taijing33 于 2020-11-16 15:17 编辑 [/i] 问题描述:使用了串口1和2,接受都是中断高优先级,发送没用中断。串口1连接的485设备,实际外部没用连接使用。串口2通过232连接的串口屏。问题出在串口2上。现在的问题是客户反应屏幕不能设置,显示正常,经判断就是串口2不能进入接受中断了,但是发送是正常的,就是假死了、。网上百度了有关信息。程序中也做了帧错误和数据溢出处理。我在办公室连续测了2天,各种乱按摔打,。就是不能重现客户遇到的问题。很是郁闷。但是客户反应的真真切切。以前在程序操作内部ee的时候关闭了中断,串口屏操作稍快就会,造成串口假死,但是我现在已经处理了。本以为解决了这个问题,没想到 到客户哪里,还是有这种情况。这种情况在客户哪里 也是几天有可能出现。但是一定会出现。 串口屏操作一次发给单片机的数据 一般不超过20个。 我的串口2接受处理逻辑。 大体意思是 串口有数据中断时,赋值Comdelay =2;一股脑的吧所有数据都接受进数组 Usart1_rbuff[100];数据一直有的话 Comdelay一直等于2; 然后再定时器中断中Comdelay --;定时器是10ms进一次中断。当Comdelay ==0认为没有数据了,这时候在接收到的数据中 找出 振头和帧尾 并进行CRC运算确认数据的正确。 下面是代码: 串口2和1的初始化代码 void config_uart1(void) { PMD1bits.RTCCMD = 1; TRISCbits.TRISC7 = 1; TRISCbits.TRISC6 = 0; TXSTA1bits.TXEN = 1; PIE1bits.TX1IE=0; //????TX PIE1bits.RC1IE=1; //RX //INITIALIZING EUART, 9 bits, 9600 baud rate PIR1bits.TX1IF = 0; //Clear EUSART Transmit Interrupt Flag bit PIR1bits.RC1IF = 0; //Clear EUSART Receive Interrupt Flag bit TXSTA1 = 0x24; //Synchronous mode:Selects 9-bit transmission, High speed BRGH=1, Transmit enabled RCSTA1 = 0x90; //Synchronous mode:Selects 9-bit reception, Continuous Receive Enable, //Serial port enabled(configures RX/DT and TX/CK pins as serial port pins) // SPBRG1 = BAUD9600; //11.0592MHz, BRGH=1, 9600bps SPBRG1 = 51; //8MHz, BRGH=1, 9600bps ODCON1 = 0; ODCON2 = 0; ODCON3 = 0; PIE1 = 0x20; //Peripheral interrupt disable PIE2 = 0; //Peripheral interrupt disable PIE3 = 0x20; //enable RC2IE/TX2IE/RTCCIE PIE4 = 0; //enable RC2IE/TX2IE/RTCCIE PIE5 = 0; //enable RC2IE/TX2IE/RTCCIE PIE6 = 0; //enable RC2IE/TX2IE/RTCCIE IPR1 = 0x20; //All peripheral interrupt /time interrupt low priority IPR2 = 0; //All peripheral interrupt /time interrupt low priority IPR3 = 0x20; //All peripheral interrupt /time interrupt low priority IPR4 = 0; //All peripheral interrupt /time interrupt low priority IPR5 = 0; //All peripheral interrupt /time interrupt low priority IPR6 = 0; //All peripheral interrupt /time interrupt low priority IPR1bits.RC1IP = 1; MAX485_EN = 0; } void config_uart2(void) { //??2 // PMD3=0xff; //外设模块禁止 // PMD2=0xff;//外设模块禁止 // PMD1=0x78;//外设模块禁止 // PMD0=0xc0;//外设模块禁止 //EECON2 = 0x55; //EECON2 = 0xaa; PMD1bits.RTCCMD = 1; TRISGbits.TRISG2 = 1; TRISGbits.TRISG1 = 0; TXSTA2bits.TXEN = 1; PIE3bits.TX2IE=0; //??TX //INITIALIZING EUART, 9 bits, 9600 baud rate PIR3bits.TX2IF = 0; //Clear EUSART Transmit Interrupt Flag bit PIR3bits.RC2IF = 0; //Clear EUSART Receive Interrupt Flag bit TXSTA2 = 0x24; //Synchronous mode:Selects 9-bit transmission, High speed BRGH=1, Transmit enabled RCSTA2 = 0x90; //Synchronous mode:Selects 9-bit reception, Continuous Receive Enable, //Serial port enabled(configures RX/DT and TX/CK pins as serial port pins) // SPBRG2 = BAUD9600; //11.0592MHz, BRGH=1, 9600bps SPBRG2 = 51; //8MHz, BRGH=1, 9600bps ODCON1 = 0; ODCON2 = 0; ODCON3 = 0; PIE1 = 0x20; //Peripheral interrupt disable PIE2 = 0; //Peripheral interrupt disable PIE3 = 0x20; //enable RC2IE/TX2IE/RTCCIE PIE4 = 0; //enable RC2IE/TX2IE/RTCCIE PIE5 = 0; //enable RC2IE/TX2IE/RTCCIE PIE6 = 0; //enable RC2IE/TX2IE/RTCCIE IPR1 = 0x20; //All peripheral interrupt /time interrupt low priority IPR2 = 0; //All peripheral interrupt /time interrupt low priority IPR3 = 0x20; //All peripheral interrupt /time interrupt low priority IPR4 = 0; //All peripheral interrupt /time interrupt low priority IPR5 = 0; //All peripheral interrupt /time interrupt low priority IPR6 = 0; //All peripheral interrupt /time interrupt low priority MAX485_EN2 = 0; } 中断中的数据接受处理 void interrupt my_isr(void){ static u8 rdata = 0; if(PIR3bits.RC2IF &&PIE3bits.RC2IE ) { rdata = RCREG2; if(Rx_en && RxCounter1 < USART1_R_LEN) { Usart1_rbuff[RxCounter1++] = RCREG2; if(RxCounter1>=USART1_R_LEN) { Rx_en = 0; Usart1_r_finish = 1; } } Comdelay = 2; //20ms????????????????? } if(PIR1bits.RC1IF &&PIE1bits.RC1IE) { rdata = RCREG; if(Rx_en0 && RxCounter < USART_R_LEN) { Usart_rbuff[RxCounter++] = RCREG; if(RxCounter>=USART_R_LEN) { Usart_r_finish = 1; //RxCounter = 0; //Rx_en0 = 0; } } Comdelay0 = 2; //20ms????????????????? } //下面这部分代码是以前别的功能忘了删除了,但是我觉得应该没有对串口假死有影响。 //下面这部分代码是以前别的功能忘了删除了,但是我觉得应该没有对串口假死有影响。 //下面这部分代码是以前别的功能忘了删除了,但是我觉得应该没有对串口假死有影响。 if(INTCONbits.INT0IF) { INTCONbits.INT0IF = 0; // if(WATER) { // Water_pulse = 0; if(dat_set_water.water_chicken <= 65534) dat_set_water.water_chicken+=1; } } } 主程序while1中的串口接受数据处理 //当发生帧错误或者溢出时,初始化串口 if(RCSTA2bits.OERR || RCSTA2bits.FERR) { RCSTA2bits.CREN = 0; config_uart2(); } if(RCSTA1bits.OERR || RCSTA1bits.FERR) { RCSTA1bits.CREN = 0; config_uart1(); } if(Usart1_r_finish) // { Rx_en = 0; //暂时拒绝接受新数据 Usart1_r_finish = 0; com_pro(); //处理数据 RxCounter1 = 0; for(i=0;i
1050浏览量 3回复量 关注量 -
M3做UDP接收数据问题 sos
项目要求多个设备进行网络通信,之前没接触过网络通信,用M3 UIP协议写了UDP通信,接收正常,当开机大概十分钟或网络报文过多就会出现不能正常接收数据,因为设备较多,网络内每秒大概有20~30个报文,报文大概20字节左右!我是直接通过uip_appdata指针获取数据!是不是用后需要清除缓存,发送没问题就接收数据不对! RecDat = (struct DatRec *)uip_appdata; if(.............) {........}发送正确的条件,一开始能正常进入if语句,时间长了就进不去了,看了,数据发的没错! uip_send(&SendDat, sizeof(SendDat)); 应用层接收发送大概就用这两函数!求大神解救啊啊啊!找不到原因啊!
784浏览量 0回复量 关注量