5273|4

58

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【雅特力开发板 AT32F421 测评】SPI使用 [复制链接]

  本帖最后由 eew_Violet 于 2021-4-18 23:38 编辑

        在使用国产替代时有一点需要格外注意,大家看下面的框图,该器件的APB1和APB2均可以满频运行,而S*M的APB1是2分频的,有时候移植过来之后发现原来可以的,现在不行了,会怀疑自己哪里漏掉了什么,有时候检查一下APB1的频率会有意外收获哦.

        这里我们看到SPI2是挂在APB1上的,所以,不用多说,找CMSIS下system_at32f4xx.c中,这里我们可以看到他的时钟配置,另外system_at32f4xx.c中已经写好了诸多时钟配置,需要哪个直接define就好.

        接下来可以着手编写SPI初始化函数了,这里我写到了at32_board.c中,

void SPI2_Init()
{
  GPIO_InitType GPIO_InitStructure;
  SPI_InitType  SPI_InitStructure;
	
	/* 启用时钟 */
  RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_SPI2, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB , ENABLE);
	

  /* 配置 SPI2引脚: 
	 *	SPI2_CLK-->PB13
	 *	SPI2_MOSI-->PB15
	 *	SPI2_NSS-->PB12
	 *	LCD_RS-->PB14
	 *	LCD_DC-->PB11
	 */
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_13| GPIO_Pins_15;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pull = GPIO_Pull_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11|GPIO_Pins_12|GPIO_Pins_14;
  GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP; 
  GPIO_InitStructure.GPIO_Pull = GPIO_Pull_NOPULL;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
  GPIO_PinAFConfig(GPIOB, GPIO_PinsSource13, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOB, GPIO_PinsSource15, GPIO_AF_0);

  /* SPI2配置*/
  SPI_DefaultInitParaConfig(&SPI_InitStructure);
  SPI_InitStructure.SPI_TransMode = SPI_TRANSMODE_TX_HALFDUPLEX   ;
  SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
  SPI_InitStructure.SPI_FrameSize = SPI_FRAMESIZE_8BIT;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_LOW;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1EDGE;
  SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;
  SPI_InitStructure.SPI_MCLKP = SPI_MCLKP_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
  SPI_InitStructure.SPI_CPOLY = 7;
  SPI_Init(SPI2, &SPI_InitStructure);
	
	SPI_Enable(SPI2, ENABLE);
}

        写法的话,很熟悉了,还有一个注意点,看似一样实际大小写和加不加s后缀还是有区别的,在配置成员之前会调用GPIO_StructInit();和SPI_DefaultInitParaConfig();函数,用来填充默认值,有时候我们并不一定会配置每个成员,所以配置之前先恢复下默认,是个好习惯.下面就是要把外设的驱动代码加入工程中去,

        .c和.h已经加入工程,下面要改写oled.h中的头文件包含和要用的IO修改,

        到这基本就完成了,编译下没报错就可以写main了,这里我自己取了下模

unsigned char COAlarm16[10][16]={


{0x00,0xC2,0xBA,0x82,0x82,0xFE,0xA2,0x90,0xFC,0x4B,0x48,0xF9,0x4A,0x48,0x08,0x00},
{0x20,0x10,0x08,0x46,0x81,0x7F,0x00,0x00,0xFF,0x22,0x22,0x3F,0x22,0x22,0x20,0x00},/*"雅",0*/
/* (16 X 16 , 宋体 )*/

{0x40,0x3C,0x10,0xFF,0x10,0x10,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x40,0x00},
{0x02,0x06,0x02,0xFF,0x01,0x01,0x00,0x02,0x0A,0x12,0x42,0x82,0x7F,0x02,0x02,0x00},/*"特",1*/
/* (16 X 16 , 宋体 )*/

{0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},
{0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x20,0x40,0x80,0x40,0x3F,0x00,0x00,0x00},/*"力",2*/
/* (16 X 16 , 宋体 )*/

{0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},
{0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},/*"科",3*/
/* (16 X 16 , 宋体 )*/

{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",4*/
/* (16 X 16 , 宋体 )*/

};

最后补上main

int main(void)
{     


  while (1)
  {
    OLED_ShowString(30,0,(uint8_t*)"Arterytek",16);
		
		OLED_ShowChinese(11,26,0,16);//雅
		OLED_ShowChinese(33,26,1,16);//特
		OLED_ShowChinese(55,26,2,16);//力
		OLED_ShowChinese(77,26,3,16);//科
		OLED_ShowChinese(99,26,4,16);//技

		OLED_ShowNum(12,50,86,2,12);//电话
		OLED_ShowChar(26,50,'-',12);
		OLED_ShowNum(36,50,23,2,12);
		OLED_ShowChar(50,50,'-',12);
		OLED_ShowNum(60,50,6868,4,12);
		OLED_ShowNum(92,50,8899,4,12);
		OLED_Refresh();
		return 0;
		
		
  }
}

       还要把SPI2_Init和OLED_Init, 放在rt_hw_board_init中,这样系统启动时候就会把他一并初始化.

烧录下,

        说明SPI已经正常上班了.

添加驱动.PNG (95.95 KB, 下载次数: 0)

添加驱动.PNG

oledc.png (145.87 KB, 下载次数: 0)

oledc.png

oledh.png (190.03 KB, 下载次数: 0)

oledh.png

最新回复

时钟配置看着还是挺简单的,楼主威武   详情 回复 发表于 2021-4-19 23:24
点赞 关注
 
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

写SPI初始化函数时,写到到了at32_board.c中,这个手册中有没有介绍

点评

spi初始函数写哪都行的,只要在rt_board_init中调用初始化即可,  详情 回复 发表于 2021-4-19 23:18
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 

谢谢分享,期待后续!

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

4
 
Jacktang 发表于 2021-4-19 09:50 写SPI初始化函数时,写到到了at32_board.c中,这个手册中有没有介绍

spi初始函数写哪都行的,只要在rt_board_init中调用初始化即可,

 
 
 

回复

1704

帖子

0

TA的资源

五彩晶圆(初级)

5
 

时钟配置看着还是挺简单的,楼主威武

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表