OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3789|回复: 2

KEIL中 C语言的结构体中能 声明函数指针么

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2015-7-29
在线时间
0 小时
发表于 2015-7-29 14:54:59 | 显示全部楼层 |阅读模式
5金钱

spi.h文件是

#ifndef __SPI_STX_H
#define __SPI_STX_H

//SPI-Ger鋞e
#define SPI_DEV_MOTION_CONTROLLER 0
#define SPI_DEV_MOTOR_DRIVER_0     1
#define SPI_DEV_MOTOR_DRIVER_1     2
#define SPI_DEV_MOTOR_DRIVER_2     3
#define SPI_DEV_BAD_DEVICE     -1

#include "derivative.h"

typedef struct
{
SPI_TypeDef *periphery;
IOPinTypeDef *CSN;
unsigned char (*readWrite) (unsigned char data, unsigned char lastTransfer);
void (*reset) (void);
} SPIChannelTypeDef;

typedef struct
{
SPIChannelTypeDef ch1;
SPIChannelTypeDef ch2;
void (*init) (void);
} SPITypeDef;

SPITypeDef SPI;
#endif

spi.c文件是
#include "../../HAL.h"
#include "../../SPI.h"

static void init(void);
static unsigned char readWrite(SPIChannelTypeDef *SPIChannel, unsigned char data, unsigned char lastTransfer);
static unsigned char readWrite_ch1(unsigned char data, unsigned char lastTransfer);
static unsigned char readWrite_ch2(unsigned char data, unsigned char lastTransfer);
static void reset_ch1();
static void reset_ch2();

static IOPinTypeDef IODummy = { .bitWeight = 3 };

SPITypeDef SPI=
{
.ch1 =
{
.periphery = SPI3,
.CSN = &IODummy,
.readWrite = readWrite_ch1,
.reset = reset_ch1
},

.ch2 =
{
.periphery = SPI2,
.CSN = &IODummy,
.readWrite = readWrite_ch2,
.reset = reset_ch2
},
.init = init
};


static void init(void)
{
  SPI_InitTypeDef SPIInit;

  //-------- SPI2 initialisieren und mit den Pins verbinden ---------
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  //SPI initialisieren
  SPIInit.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
  SPIInit.SPI_Mode=SPI_Mode_Master;
  SPIInit.SPI_DataSize=SPI_DataSize_8b;
  SPIInit.SPI_CPOL=SPI_CPOL_High;
  SPIInit.SPI_CPHA=SPI_CPHA_2Edge;
  SPIInit.SPI_NSS=SPI_NSS_Soft;
  SPIInit.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
  SPIInit.SPI_FirstBit=SPI_FirstBit_MSB;
  SPIInit.SPI_CRCPolynomial=0;
  SPI_Init(SPI2, &SPIInit);
  SPI_Cmd(SPI2, ENABLE);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

  //-------- SPI3 initialisieren und mit den Pins verbinden ---------
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);

  //SPI initialisieren
  SPIInit.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
  SPIInit.SPI_Mode=SPI_Mode_Master;
  SPIInit.SPI_DataSize=SPI_DataSize_8b;
  SPIInit.SPI_CPOL=SPI_CPOL_High;
  SPIInit.SPI_CPHA=SPI_CPHA_2Edge;
  SPIInit.SPI_NSS=SPI_NSS_Soft;
  SPIInit.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
  SPIInit.SPI_FirstBit=SPI_FirstBit_MSB;
  SPIInit.SPI_CRCPolynomial=0;
  SPI_Init(SPI3, &SPIInit);
  SPI_Cmd(SPI3, ENABLE);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);

  reset_ch1();
  reset_ch2();
}

static void reset_ch1()
{
SPI.ch1.CSN = &IODummy;
SPI.ch1.periphery = SPI3;
SPI.ch1.readWrite = readWrite_ch1;
}

static void reset_ch2()
{
SPI.ch2.CSN = &IODummy;
SPI.ch2.periphery = SPI2;
SPI.ch2.readWrite = readWrite_ch2;
}

static unsigned char readWrite_ch1(unsigned char data, unsigned char lastTransfer)
{
return readWrite(&SPI.ch1, data, lastTransfer);
}

static unsigned char readWrite_ch2(unsigned char data, unsigned char lastTransfer)
{
return readWrite(&SPI.ch2, data,lastTransfer);
}
`
static unsigned char readWrite(SPIChannelTypeDef *SPIChannel, unsigned char data, unsigned char lastTransfer)
{
if(SPIChannel->CSN->bitWeight == 3) return 0;

HAL.IOs->config->setLow(SPIChannel->CSN);

while(SPI_I2S_GetFlagStatus(SPIChannel->periphery, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPIChannel->periphery, data);
while(SPI_I2S_GetFlagStatus(SPIChannel->periphery, SPI_I2S_FLAG_RXNE)==RESET);
if(lastTransfer) HAL.IOs->config->setHigh(SPIChannel->CSN);
return SPI_I2S_ReceiveData(SPIChannel->periphery);
}

我在KEIL中 照着这种方式写 通不过呢

最佳答案

查看完整内容[请看2#楼]

是可以的。 但是你的赋值写法,估计i就不成了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-29 14:55:00 | 显示全部楼层
是可以的。
但是你的赋值写法,估计i就不成了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2015-7-30 00:16:36 | 显示全部楼层
自己找问题去。。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 06:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表