This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TM4C123GH6PM:代码中的位移实现问题

Guru**** 2609285 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/756423/compiler-tm4c123gh6pm-issue-with-bit-shift-implementation-in-code

器件型号:TM4C123GH6PM

工具/软件:TI C/C++编译器

你(们)好。

我不熟悉 Tiva。 我尝试编写一个代码来生成正弦波、以便在嵌入式 C 中生成声音。 我使用 FPU 生成声音。 我不知道将32位值转换为8位值的位移位方法。 我的代码生成32位的值、我需要写入8位值。 这里有人可以帮助我吗?  

以下是我的代码:

#include 
#include 
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include 
#include "driverlib/fpu.h"
#include "driverlib/debug.h"
#include "driverlib/pwm.h"
#include "driverlib/pin_map.h"

#ifndef M_PI



#define M_PI 3.1415926535897323846
#define PWM_FREQUENCY 55


#endif #endif M_PI #define MCUt_32




;


volatile uint32_t =



volatile ut t_t t_uint0;volatile uint32_t 32_t float = volatile ut t_t 32_t rint 32;volatile uinth =volatile t_t 32_t float t 32_t rint 32;








t uint_t 32_t_t_t t


SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_16MHz|SYSCTAL_OSC_MAIN);//设置时钟



// SysCtlPWMClockSet (SYSCTL_PWMDIV_64);



// SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);



SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//为 Switch 启用端口 A



SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//为 DAC 启用端口 B



SysCtlDelay(3);



//GPIOPinTypePWM (GPIO_PORTD _BASE、GPIO_PIN_0);



//GPIOPinConfigure (GPIO_PB0_M1PWM0);



GPIOPinTypeGPIOInput (GPIO_Porta_base、GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);



GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);



GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_2、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);// PIN2的内部下拉电阻器



FPULazyStackingEnable();



FPUEnable();



// uint32_t ui32PinData;



fRadians 浮点;



int32_t i32DataCount = 0;



uint8_t i = 0;



fRadians =((2 * M_PI)/ series_length);



while (1)
{
A = GPIOPinRead (GPIO_Porta_base、GPIO_PIN_2);


如果(A=0)


{

while (i32DataCount < series_length)

{

gSerialesData[i32DataCount]= 100*sinf (fRadians * i32DataCount);



对于(i=0;i<=100;i++)



{

// j = 100*gSerialesData[i];

GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7、gSerialesData[i]);

}
i32DataCount++;
}

i32DataCount =0;

}

}

 


另外、有人能告诉我、我在实施过程中是否遇到了错误吗? 我已在 www.cse.iitb.ac.in/.../TM4C123G_LaunchPad_Workshop_Workbook.pdf 上参考 FPU 代码

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Nikita、

    该论坛实际上是针对特定于器件的问题、而不是 C 代码实现。 这类问题最适合于像 Stackoverflow 这样的站点。

    尽管如此、您不知道我将回答这一个问题、但请保留有关 TM4C MCU 及其外设的器件特定问题的未来主题。

    要将32位输出放入8位变量中、您有几个选项。 最快的方法是、如果您知道32位变量中的前8位数据就是您所需要的。 如果是这种情况、您可以执行简单的拼写检查:

    ui8Variable1 =(uint8_t) ui32Variable2; 

    如果您需要拉出高于前8位的位、则还需要应用位移来移动您希望位于32位变量的最低8位的位、然后再执行拼写检查。 例如、如果32位变量中有0x87654321之类的数据、并且希望0x43位于8位变量中、则必须先向右移8位、然后按如下所示键入 cast:

    ui8Variable1 =(uint8_t)(ui32Variable2 >> 8); 

    阅读的一些链接: https://www.cprogramming.com/tutorial/lesson11.html

    https://www.tutorialspoint.com/cprogramming/c_bitwise_operators.htm

    https://stackoverflow.com/questions/141525/what-are-bitwise-shift-bit-shift-operators-and-how-do-they-work

    最后、对于浮点、如果您想保留小数、这完全是另一个主题、有关这一点、请参阅我之前发布的有关如何处理此类情况的文章: e2e.ti.com/.../2438264

    希望这对您有所帮助、祝您好运!