雅特力AT32F403A pin to pin STM32F103

 在今年的年初,开始使用雅特力AT32F403A/F413 RCT7两款型号,可以pin to pin STM32F103RCT6.开始根据参考手册和bsp的指引,附上F403A数据手册和参考手册,发现AT库和ST的库较为类似,但因为使用到了64pin的XMC,由于资源外设决定必须使用AT库配置XMC的寄存器,所以就放弃了使用ST库,在看参考手册和与雅特力原厂工程师交流的过程中,使用AT库大致知道方向。
并成功申请到了AT32F403A的开发板,在开发板上我从板载的LED和按键开始,利用定时器中断点亮跑马灯,验证UART的中断收发,通用定时器的pwm输出。当时对ST库和AT库的pwm,adc,exti,gpio,xmc,tmr等几个部分进行过详细的对比,发现移植的步骤是把结构体初始化一样的移植过来,只是名字上要使用AT的库命名。并且AT库的主频选择上可以比ST库更高,适合做gui,主频越高则刷屏越流畅。

参考了AT库的bsp XMC后移植demo例程并完成了初始化,此处的寄存器配置要对应各位的板子上XMC复用引脚组,这里手册截图到了XMC的复用IO口,重映射和非重映射各有一组IO可进行复用,看附图。

       从RCC,GPIO,XMC,SYSTICK,RTC,PWM,以及移植emwin的gui控件,在原厂工程师和参考手册的帮助下,轻而易举的从ST库移植成AT库并只用了3天时间,而移植后使用到的项目是做一款带LCD显示的空气检测器,在和AT32的各个外设的操作过程中,结合自己之前使用ST的经验,以最快的速度对AT的bsp的理解以及移植调用,在底层的理解上所花的时间并不多,所以对外设和整体功能的把握有了信心。用轮询配合外部中断以及定时器中断轮换切换gui的点,线,2D绘图和文本,达到了可以通过中断事件的处理完成一些简单的显示功能。然后调用字体的颜色显示让字体显示出不同颜色,后面还需要显示二氧化碳,甲醛,pm2.5,温湿度等空气质量的数据,主要是使用UART和IIC了,串口的轮询发送和中断接收的方式比较稳定的读到了传感器返回的字节并做有简单的校验方式。IIC则是温湿度的数据读取,起始位,传输W/R 位,传输数据位,停止位,并辅以示波器查看IIC波形,最后贯穿gui显示完成了所有功能。在雅特力高主频的性能上显示ui更加的流畅,而如果是用STM32F103,当时没有外部晶体的情况下,则主频上最高只能到64Mhz,而我当时使用AT库,主频就配置到了内部72MHz,对于9600的串口波特率也正常稳定传输。

      用gui的2D绘图方式在LCD上画圆环的方法如下:
复制
int x0 = 158,y0=110;

for(i=0;i<90;i++)

        {

                float a = (i*10)*3.1415926/360;//角度

                int x = 65*cos(a)+x0; 

                int y = 65*sin(a)+y0;

                GUI_DrawLine(85*cos(a)+x0,85*sin(a)+y0,x,y);

        }

圆环的做法也就是用的线条做的,做法就是用圆的参数方程x= a+r*cos 角度  y = a+r*sin 角度,参数方程表示的就是圆上的一点和圆半径r的关系,也就是三角函数

(i*10)也就是按 10/360 角度等分扇形

65表示的是小圆的半径r,85表示的是大圆的半径R 。那么线条也就是起始坐标到端点坐标。那么我只要把起始坐标用大圆的上面的点坐标-小圆上面的点坐标,得到的就是环形了。图形类似于图片中间的环形了!


"受任于败军之际,奉命于危难之间"
2021年,前受疫情影响,后有芯片紧缺,在此危难之间,雅特力迎难而上。AT32F403A,AT32F413给我们的样品带来希望,AT32F403A/413以高主频兼容SXX32F103的优势强势归来,F403A的XMC解决RCT7的小封装的LCD 8080接口问题,3路UART直击传感器收发,IIC模拟时序读取温湿度,RTC按键调时写后备寄存器,gui显示,按键切换页面,外部中断唤醒低功耗模式。这些外设的使用在雅特力的参考手册和FAE的帮助下得到了逐步的解决

"虎踞龙盘今胜昔,天翻地覆慨而慷"
希望下半年的缺货潮雅特力能走出来,最后点击这里可查看我自己用AT32F403A+emwin完成的环境检测器video,加油,雅特力中国芯!

此文章已获得原创/原创奖标签,著作权归21ic所有,未经允许禁止转载。
4.png (502.22 KB, 下载次数: 80)


---------------------
作者:hejun96
链接:https://bbs.21ic.com/icview-3160422-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
 

下面是AT32F421 IIC接收的示例代码,仅供参考: ```c #include "at32f4xx.h" #include "at32_board.h" #define I2C_SLAVE_ADDRESS 0x50 void I2C_Configuration(void) { GPIO_InitType GPIO_InitStructure; I2C_InitType I2C_InitStructure; /* enable I2C1 and GPIOB clock */ RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE); /* Configure I2C1 pins: SCL and SDA */ GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6 | GPIO_Pins_7; GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); /* I2C1 configuration */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2CDevice; I2C_InitStructure.I2C_FmDutyCycle = I2C_FmDutyCycle_2_1; I2C_InitStructure.I2C_OwnAddress = I2C_SLAVE_ADDRESS; I2C_InitStructure.I2C_Speed = 100000; I2C_Init(I2C1, &I2C_InitStructure); /* Enable I2C1 */ I2C_Cmd(I2C1, ENABLE); } uint8_t I2C_ReadData(uint8_t SlaveAddress, uint8_t RegisterAddress) { uint8_t result = 0; /* wait until I2C is not busy */ while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BusBusy)); /* send start condition */ I2C_GenerateSTART(I2C1, ENABLE); /* wait until start condition is generated */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* send slave address */ I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Transmitter); /* wait until address is sent */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* send register address */ I2C_SendData(I2C1, RegisterAddress); /* wait until data is sent */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* send start condition again */ I2C_GenerateSTART(I2C1, ENABLE); /* wait until start condition is generated */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* send slave address again */ I2C_Send7bitAddress(I2C1, SlaveAddress, I2C_Direction_Receiver); /* wait until address is sent */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); /* disable ACK */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* wait until data is received */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* read data */ result = I2C_ReceiveData(I2C1); /* send stop condition */ I2C_GenerateSTOP(I2C1, ENABLE); /* wait until stop condition is generated */ while(I2C_GetFlagStatus(I2C1, I2C_FLAG_StopDetect)); /* enable ACK */ I2C_AcknowledgeConfig(I2C1, ENABLE); return result; } int main(void) { uint8_t data = 0; /* configure I2C1 */ I2C_Configuration(); /* read data from slave device */ data = I2C_ReadData(I2C_SLAVE_ADDRESS, 0x00); while (1) { /* do something with data */ /* ... */ } } ``` 这是一个简单的I2C接收例程,其中I2C_ReadData()函数用于从I2C从设备读取数据。在主函数中,首先需要调用I2C_Configuration()函数配置I2C通信参数。然后,通过调用I2C_ReadData()函数从指定的从设备读取数据。最后,可以对读取到的数据进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值