จะเกิดอะไรขึ้นบน STM32 เมื่อกำหนดค่าสองพินเพื่อให้มีฟังก์ชั่นสำรองเหมือนกัน


10

อ่านผ่านคู่มือ STM32F051 ดูเหมือนว่าเป็นไปได้ที่จะกำหนดค่าฟังก์ชั่นทางเลือกเดียวกันบนสองพิน ตัวอย่างเช่นคุณอาจมีหมุด USART1_TX หลายอันในเวลาเดียวกัน หรือตัวอย่างเช่นกรณีที่มีปัญหามากกว่าของหมุด USART_RX สองอัน คู่มือนี้เงียบในกรณีนี้ กฎหมาย / ปลอดภัยนี้หรือไม่ สิ่งนี้มีประโยชน์หรือไม่?


2
คำถามที่น่าสนใจ ฉันสามารถดูว่าทำไมบางครั้งมันจะมีประโยชน์แม้ว่าตัวอย่างเช่นในขณะที่การดีบั๊กเพื่อรับเอาท์พุท TX ไปยังขาอื่นหรือเพื่อรับนาฬิกาบัฟเฟอร์ในบางสถานที่ อาจเพิ่มมูลค่าในลิงก์คู่มือที่เกี่ยวข้องแม้ว่าจะช่วยให้ทุกคนไม่ต้องค้นหามัน
PeterJ

อีกครั้ง - คำถามที่น่าสนใจ แต่กรณีของการกำหนด USART_RX จากพินที่แตกต่างกันสองอันล่ะ? ใครจะหวังว่าผู้ออกแบบชิปได้วางแผนแผนการจัดลำดับความสำคัญสำหรับอีกคนหนึ่งเมื่อเทียบกับการอนุญาตให้การแข่งขันภายในจากสองแหล่ง
Michael Karas

ฉันไม่เคยลองสิ่งนี้ แต่จากสิ่งที่ฉันจำได้จากแผนภาพไดอะแกรมคุณจะต้องเชื่อมต่อหมุดเข้าด้วยกันภายใน
rjp

คำตอบ:


5

บนโปรเซสเซอร์ที่ใช้รีจิสเตอร์ต่อพินเพื่อเลือกฟังก์ชั่น I / O โดยทั่วไปแล้วเป็นไปได้ที่จะกำหนดเส้นทางฟังก์ชันเอาต์พุตไปยังหลายพินโดยไม่มีข้อขัดแย้ง หมุดทั้งหมดจะสะท้อนเอาต์พุตเดียวกัน ผลกระทบของการมีหลายพินเชื่อมต่อกับอินพุตมักไม่ได้รับการกำหนด ถ้าเช่น EART มี I / O หมุด 3 และ 4 เชื่อมต่อกับ UART มันอาจทำงานราวกับว่า UART เชื่อมต่อกับประตู "และ" ซึ่งใช้หมุด 3 และ 4 เป็นอินพุตหรืออาจทำงานราวกับว่ามันเชื่อมต่ออยู่ กับพินหนึ่งและไม่สนใจอีกอันหรืออาจเชื่อมต่อพินทั้งสองเข้ากับบัฟเฟอร์อินพุตของ UART ผ่านทรานซิสเตอร์ที่มีความต้านทานในระดับปานกลางหรือมันอาจวาดกระแสพิเศษเมื่อพิน 3 สูงและ 4 ต่ำหรือในทางกลับกันหรือ อาจทำอะไรก็ได้ที่จินตนาการได้ ฉันไม่ '

วิธีการออกแบบที่ค่อนข้างดีกว่าใช้ในบางส่วนของ Microchip (อาจเป็นบางส่วนของ STM) เช่นกันคือการให้แต่ละฟังก์ชั่น I / O รวมถึงมัลติเพล็กเซอร์เพื่อเลือกพินที่มันควรจะรับข้อมูลจากและมีพิน / O ฟังก์ชั่นที่ควรส่งออกข้อมูล การออกแบบดังกล่าวทำให้สามารถป้อนพินได้หลายฟังก์ชั่น I / O ในขณะเดียวกันก็กำจัดความคลุมเครือใด ๆ ที่เกิดจากการกำหนดค่าที่ขัดแย้งกันไปพร้อม ๆ กัน


3

ใช่มันมีประโยชน์ ผลลัพธ์จากการทดลองบน STM32F407VGT6: ทั้งสองขา AF สามารถใช้เป็น AF พร้อมกันอย่างน้อยถ้าใช้หมุดเหล่านี้เป็นอินพุต AF การทดลองคือการเรียกใช้ TIM1 บนขอบที่เพิ่มขึ้นของทริกเกอร์ภายนอก - สัญญาณ "TIM1_ETR" สัญญาณ "TIM1_ETR" สามารถจับคู่กับหมุด PE7 และ / หรือ PA12 ของแพ็คเกจ MCU ได้

การทดลอง: เตรียมใช้งานหมุดทั้งสอง PE7 และ PA12 เป็น AF "TIM1_ETR" สำหรับ TIM1:

{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pin = GPIO_PIN_7;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // configure PE7 as AF

    GPIO_InitStruct.Pin = GPIO_PIN_12;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // configure PA12 as AF
}

ผลลัพธ์ - TIM1 เริ่มต้นโดยการเพิ่มขอบบนหมุด PE7 หรือ PA12 ใด ๆ

วิธีนี้แสดงให้เห็นถึงวิธีการ MUX (เปลี่ยน) พิน AF ในเวลาทำงาน:

main
{
  GPIO_InitTypeDef GPIO_InitStruct = { 0 };

// Deactivate PA12 input (set as regular input):
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// select PE7 as a trigger source,
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// Arm the timer
    arm_tim1();

/* Now timer will be started by rising edge only on PE7 */

// ... later one can select PA12 as trigger source. Deactivate PE7 (set as regular input):
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// Activate PA12
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// Arm the timer
    arm_tim1();
/* timer will be started by rising edge only on PA12 */
}

สิ่งนี้สามารถช่วยได้แล้วจำเป็นต้องใช้แหล่งที่แตกต่างกันสองแหล่งสำหรับตัวจับเวลาการเรียก อินพุตทั้งสองสามารถใช้ได้พร้อมกันหากเริ่มต้นตามที่แสดงในตอนต้นของโพสต์ อินพุตไม่ได้เชื่อมต่อกันฉันหมายถึงสัญญาณใน PA12 ไม่ถูกถ่ายโอนไปยัง PE7 และในทางกลับกัน (เนื่องจาก GPIO ตั้งเป็นอินพุต)

รหัสถูกสร้างขึ้นโดย "STM32CubeF4 v5.3" + "แพ็คเกจเฟิร์มแวร์ V1.24.0 / 08-February-2019"


2

โดยทั่วไปพินคือ GPIO ซึ่งสามารถกำหนดให้กับฟังก์ชั่นทางเลือกเช่น UART_RX ทุกฟังก์ชั่นสำรองมีพินเป็นค่าเริ่มต้นและพินสำรองซึ่งฟังก์ชันสามารถทำการแมปใหม่ได้ หากคุณดูคู่มืออ้างอิงของ STM32F103ในหัวข้อ 9.1.5 พวกเขาพูดว่า:

ในการปรับจำนวนฟังก์ชั่นอุปกรณ์ต่อพ่วง I / O ให้เหมาะสมที่สุดสำหรับแพ็คเกจอุปกรณ์ที่แตกต่างกันเป็นไปได้ที่จะทำการแมปฟังก์ชั่นทางเลือกบางอย่างเข้ากับพินอื่น ๆ นี้จะทำได้โดยซอฟต์แวร์โดยการเขียนโปรแกรมลงทะเบียนที่สอดคล้องกัน (โปรดดูที่ AFIO ลงทะเบียนในหน้า 177 ในกรณีที่ฟังก์ชั่นอื่นจะไม่แมปไป assignations


วิธีที่ฉันจะทำคือ: เมื่อคุณกำหนดพินใหม่การกำหนดก่อนหน้านี้จะถูกลบออกดังนั้นคุณจึงไม่สามารถเชื่อมต่อพินหลายตัวเข้ากับฟังก์ชั่นอุปกรณ์ต่อพ่วงเดียวกันได้ในทางเทคนิค
dext0rb

1
เป็นไปไม่ได้เพราะ (อย่างน้อยใน F103 ฉันไม่ได้ทำงานกับอนุพันธ์อื่นของ STM32) ไม่สามารถกำหนดพินสำรองให้กับฟังก์ชั่นโดยไม่ต้องใช้คุณสมบัติการแมปแม้ว่าคุณจะตั้งค่าเป็น AF_Output ตั้งค่า GPIO และหลังจากทำการแมปใหม่ฟังก์ชัน i จะไม่สามารถใช้งานได้บนพินเดิมอีกต่อไป ฉันหวังว่านี่จะอธิบายสิ่งที่ฉันต้องการ
Manu3l0us

1
วิธีการนี้ทำแตกต่างกันมากในตระกูลย่อยที่แตกต่างกัน โครงสร้างการลงทะเบียน F1 อาจห้ามไม่ให้ แต่โครงสร้าง F3 นั้นแตกต่างกันซึ่งคุณกำหนดค่าพินเป็นฟังก์ชันทางเลือกแทนฟังก์ชันเป็นพินดังนั้นการแมปที่ซ้ำกันจึงเป็นไปได้ ผลที่ตามมาคือคุณไม่ได้ตอบคำถามที่ถามซึ่งดูเหมือนจะเกี่ยวกับส่วนที่โครงสร้างการลงทะเบียนอนุญาต
Chris Stratton

1
@Chris Stratton STM32F302 คู่มืออ้างอิงส่วน 8.3.2: "พิน I / O ของอุปกรณ์เชื่อมต่อกับอุปกรณ์ต่อพ่วง / โมดูลออนบอร์ดผ่านอุปกรณ์มัลติเพล็กเซอร์ ด้วยวิธีนี้จะไม่มีข้อขัดแย้งระหว่างอุปกรณ์ต่อพ่วงที่มีอยู่ในพิน I / O เดียวกัน " แต่จริงๆแล้วมันไม่ได้พูดอะไรเกี่ยวกับ I / O หลายอันใน AF เดียว มีตัวเลือกมากมายสำหรับพินอินพุตหรือไม่
Manu3l0us

1
ฉันขอขอบคุณข้อมูล F1x เช่นกันฉันก็ใช้สิ่งนั้นเช่นกัน :-)
joeforker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.